Free audit with a recorded video walkthrough in 3 business days Plans and prices published for every service You own every account, dashboard and line of code Senior-led, with hours that overlap the full US business day

Drupal Development

Drupal Module Development for Custom Logic and Integrations

Custom Drupal 10 and 11 modules for organizations whose workflows, data or connected systems go beyond what contributed modules offer.

Drupal module development is writing custom PHP code that extends Drupal with features its core and contributed modules do not provide, such as business rules, custom data types and connections to outside systems. We build modules for Drupal 10 and 11 to Drupal coding standards, with automated tests, and hand over the code in your own repository.

US-registered LLC Free audit with video walkthrough No long lock-ins Flexible ways to pay
On this page
  1. Custom Drupal Module Development Services We Offer
  2. What Is Drupal Module Development? The Anatomy of a Module
  3. Drupal Module Development Process We Follow
  4. Drupal Integrations: Connecting Drupal to CRM, ERP, SSO and Payment Systems
  5. Drupal AI Module Development
  6. Drupal 7, 8, 9, 10 and 11 Module Development: What Changed
  7. Contributed Module, Patch or Custom Drupal Module?
  8. How We Test Custom Drupal Modules
  9. Contributing Drupal Module Work Back to the Community
  10. Drupal Module Development Deliverables
  11. Drupal Module Development Pricing
  12. Mistakes in Custom Drupal Modules We Get Called to Fix
  13. Who Needs Custom Drupal Module Development
  14. Related Drupal and Integration Services

Drupal module development is how a Drupal site gets features that nobody else needed in quite the same way: an approval workflow that matches your organization, a product finder with your own rules, a nightly sync with your CRM. Drupal core and thousands of contributed modules cover most needs, and a custom module fills the gap between them and your requirements. It is one of the main parts of our Drupal development services.

You get a module that installs like any other, keeps its settings in Drupal configuration, respects Drupal's permission and caching systems, and comes with automated tests and a README. Because it follows Drupal's own architecture, it keeps working through core updates instead of becoming the reason you cannot update.

Custom Drupal Module Development Services We Offer

Module typeExamplesWhat it means for you
Small custom modulesA custom block, form, field formatter, token or hook implementationA targeted change without patching anything else
Business logic modulesCustom content entities, workflows, calculators, eligibility rules, admin settings forms and permissionsYour process modeled in Drupal, not worked around
Integration modulesCRM, ERP, payment gateway, single sign-on or third-party API connections with queued syncData moves between systems without manual exports
Plugins for existing systemsViews display styles and filters, field types and widgets, block plugins, migrate source pluginsNew capability that editors use through familiar screens
AI featuresContent suggestions, summaries, alt text and semantic search built on the Drupal AI moduleAI help for editors, with a human approving the output
Contrib patchesFixes or small features for contributed modules, submitted upstream where appropriateProblems fixed at the source, not hidden in your codebase
Drupal 7 module portsRewriting Drupal 7 custom modules for Drupal 10 or 11Custom features survive the move off an unsupported version

What Is Drupal Module Development? The Anatomy of a Module

A Drupal module is a folder of code that Drupal discovers, installs and runs as part of the site. Modern Drupal, from version 8 onward, is built on Symfony components, so a module is mostly object-oriented PHP organized into well-known files and classes. Knowing the parts helps you read a quote or review code:

File or folderPurpose
my_module.info.ymlDeclares the module's name, description, dependencies and supported core versions
my_module.moduleProcedural hook implementations, where still used
my_module.routing.ymlMaps URLs to controllers and forms, with access requirements
my_module.services.ymlRegisters services and event subscribers for dependency injection
my_module.permissions.ymlDefines permissions that site admins grant to roles
my_module.libraries.ymlDeclares CSS and JavaScript assets the module attaches
src/PHP classes: controllers, forms, plugins, entities, services and hook classes
config/install and config/schemaDefault configuration and the schema describing it
templates/ and tests/Twig templates and PHPUnit tests

Hooks, events and plugins

Modules change Drupal's behavior in three main ways. Hooks let a module react to things Drupal does, such as saving a node or altering a form; since Drupal 11.1 they can be written as methods on classes marked with a Hook attribute, instead of only as procedural functions. Events, from Symfony, let a module subscribe to request and system events. Plugins are swappable units such as blocks, field widgets and Views filters, discovered automatically from attributes or annotations. Choosing the right mechanism is a large part of writing a module that stays maintainable. A module that alters a form through a hook, for example, survives core updates far better than one that copies and replaces the whole form, and it leaves other modules free to make their own changes to the same form.

Drupal Module Development Process We Follow

  1. Check contrib first (1 to 3 days). We search drupal.org for contributed modules that already cover the need, fully or partly. Configuring or extending a maintained contributed module often beats writing new code.
  2. Specification (about 1 week). Data model, screens, permissions, configuration, integrations and edge cases written up for your approval, with a fixed quote.
  3. Build (1 to 6 weeks). Development in DDEV against a copy of your site, using Drush code generators for scaffolding and dependency injection throughout. You review progress on a staging site.
  4. Tests and code review (in parallel). Unit, kernel and functional PHPUnit tests for the core logic, PHP_CodeSniffer with Drupal coding standards, and PHPStan static analysis.
  5. Deployment (1 to 2 days). The module ships through Composer and Git, configuration through config import, and any data changes through update hooks so every environment ends up the same.
  6. Handover. README, configuration notes, permissions list and a walkthrough for site administrators.

Drupal Integrations: Connecting Drupal to CRM, ERP, SSO and Payment Systems

Integration modules are where custom Drupal work earns its keep, and where shortcuts hurt most. A form that posts directly to a CRM during the page request fails when the CRM is slow. We build integrations to survive that:

  • Queued sync. Outgoing data goes into Drupal's Queue API and is processed by cron or a worker, with retries and a dead-letter log for records that keep failing.
  • Secrets out of code. API keys are stored with the Key module or environment variables, not in configuration exported to Git.
  • Logging and alerts. Every sync writes to a dedicated log channel, and admins receive alerts when failures pass a threshold.
  • Single sign-on. SAML and OpenID Connect logins through maintained contributed modules, with custom code only for role mapping and provisioning rules.
  • Payments and commerce. Custom payment gateway plugins for Drupal Commerce when your provider has no maintained module.

Drupal AI Module Development

Drupal's AI module gives sites a common way to connect to AI providers such as OpenAI, Anthropic and others, so features are not tied to one vendor. We build on it rather than calling a provider directly. Typical features include suggested summaries and meta descriptions in the editor, generated alt text that an editor reviews, content tagging against your taxonomy, and semantic search that finds related content by meaning. Each feature runs on your own API keys, logs what it sends, and keeps a person in the approval loop for anything published.

Drupal 7, 8, 9, 10 and 11 Module Development: What Changed

Drupal 7 module development used procedural PHP, .info files and hooks for almost everything. Drupal 8 rebuilt the system on Symfony with services, plugins, YAML configuration and object-oriented code. Drupal 9, 10 and 11 kept that architecture and mainly removed deprecated APIs, raised PHP requirements and added features such as attribute-based plugin discovery and object-oriented hooks.

In practice, a well-written Drupal 9 module needs small changes to run on Drupal 11, while a Drupal 7 module needs a rewrite. Drupal 7 reached end of life in January 2025, so we do not start new Drupal 7 module development. We do port Drupal 7 modules to current Drupal, usually alongside a full site migration, and ongoing upkeep of finished modules sits with our Drupal maintenance services.

Contributed Module, Patch or Custom Drupal Module?

OptionWhen it fitsTrade-off
Contributed module as isA maintained, security-covered module does what you needYou accept its design choices and release schedule
Contributed module plus a patchA good module has one missing feature or bugThe patch must be re-checked on each update until it is merged upstream
Contributed module plus a small custom moduleYou need to alter behavior through hooks, events or pluginsSmall custom code to maintain, but no forked contrib code
Fully custom moduleThe requirement is specific to your organizationYou own all of it, so quality and tests matter

How We Test Custom Drupal Modules

Drupal supports several kinds of automated tests, and a custom module should use the cheapest kind that proves each behavior. Unit tests check pure PHP logic such as price calculations or data mapping, and run in seconds. Kernel tests boot a minimal Drupal with only the modules needed, which suits entity, configuration and service tests. Functional tests run a full site in a browser simulation to check pages, forms and permissions, and functional JavaScript tests cover interactive behavior.

For integration modules we also mock the outside API, so tests can simulate slow responses, errors and unexpected data without touching your live CRM or ERP. Tests run on every change in a CI pipeline such as GitHub Actions or GitLab CI, so a future update that breaks the module is caught before it is deployed.

Contributing Drupal Module Work Back to the Community

Not every custom module should stay private. When a fix or feature would help other sites, contributing it to the relevant project on drupal.org means the maintainers carry it forward and your site stops depending on a private patch. We submit patches and merge requests to contributed projects when the change is general, and we keep business logic that is specific to you in your own custom module.

If you want a generic module published as a new contributed project, we can prepare it for drupal.org, including documentation and a clear maintenance plan. Contribution is your choice; nothing is published without your agreement.

Drupal Module Development Deliverables

  • Module code in your Git repository, installed through Composer.
  • Configuration schema, default configuration and an admin settings form where needed.
  • Permissions defined and documented, with route access checks on every page and endpoint.
  • PHPUnit tests covering the core logic, passing in your CI pipeline or ours.
  • Clean PHP_CodeSniffer and PHPStan reports.
  • A README covering installation, configuration, dependencies and how to extend it.
  • Update hooks for any data or schema changes, so deployments are repeatable.

We also record the decisions behind the module: why a contributed option was rejected, which system owns which data, and what happens when an outside service fails. That record matters more than the code comments when someone needs to change the module two years from now.

Success means the module does what the specification says, passes its tests, survives a core minor update without changes, and can be understood by the next developer who opens it.

Drupal Module Development Pricing

We price modules as fixed projects after specification. A small module, such as one block, form or formatter, has a set price. Larger modules are quoted from a starting price, and cost depends on the data model, the number of screens and permissions, the outside systems involved, how sync handles failures, and the level of test coverage you want.

Small Module

$900 one-time

One-time, paid upfront

  • One focused custom module or contrib module patch
  • Examples: custom block, form, field formatter or hook
  • Built to Drupal coding standards
  • Configuration exportable with the rest of your site
  • Tested on staging
  • 30 days support, 1 to 2 weeks
Get a custom quote

Integration Module

From $4,500 project

One-time, milestone billing

  • Connects Drupal to a CRM, ERP, payment gateway, SSO or API
  • Queued and scheduled sync with retries
  • Logging and admin alerts
  • Secure credential storage
  • 60 days support
Add-on
Module updates for new Drupal versions: from $300
Get a custom quote

All prices in USD. Need something different? Ask for a custom quote.

Ways to pay
  • Zelle
  • Bank transfer (ACH or wire)
  • Wise
  • PayPal
How payment works

For a module that is part of a larger build or migration, send us your requirements for a custom quote.

Mistakes in Custom Drupal Modules We Get Called to Fix

  • Static service calls everywhere. Code that calls the global Drupal class instead of using dependency injection, which makes it hard to test and replace.
  • Missing cache metadata. Render arrays without cache tags and contexts, so pages show stale content, or worse, one user's personalized content is cached and shown to another.
  • Routes without access checks. Admin pages or JSON endpoints that anyone can reach by guessing the URL.
  • Raw SQL built from strings. Queries assembled by hand instead of through the database API with placeholders, which opens the door to SQL injection.
  • Configuration without schema. Settings that cannot be translated or validated, and that break configuration import.
  • No update hooks. Data changes made by hand in production that no other environment knows about.

Who Needs Custom Drupal Module Development

A good fit if you:

  • Run Drupal 10 or 11 and have a workflow or integration that contributed modules do not handle.
  • Have custom Drupal 7 modules that must move to current Drupal.
  • Inherited custom modules that block updates and need rewriting properly.
  • Want AI features in the editor that run on your own provider keys.

Probably not a fit if you:

  • Need something a maintained contributed module already does; we will point you to it.
  • Want new Drupal 7 development; we only port Drupal 7 code forward.
  • Are learning module development yourself; the drupal.org documentation and its step-by-step tutorials are the better starting place.

Modules often go hand in hand with front-end work, handled by our Drupal theme development team, and with ongoing upkeep through our Drupal support plans. For connections between several platforms, see our CMS integration service.

Drupal Module Development questions

What are Drupal modules?
Modules are packages of code that add or change features in Drupal. Drupal core itself is made of modules, such as Node, Views and Media, and thousands of contributed modules on drupal.org add more, from SEO tools to commerce. Custom modules are written for one site or organization when neither core nor contributed modules cover a requirement. Each module can be installed, configured and uninstalled independently.
How do I clear the cache after changing a module's .info.yml file?
Run drush cr to rebuild caches, or use the Clear all caches button under Configuration, then Development, then Performance. Be aware that some .info.yml changes, such as new dependencies or default configuration, only take effect when the module is installed. For those, uninstall and reinstall the module on a development site, or write an update hook so existing sites receive the change.
How do I start Drupal module development?
Set up a local Drupal site with DDEV, then create a folder under modules/custom with a .info.yml file declaring the module name and core version requirement. Add a routing file and a controller to output a simple page, enable the module and rebuild caches. The drupal.org Hello World tutorial walks through these steps, and Drush code generators can scaffold the files for you.
Can you upgrade our Drupal 7 custom modules to Drupal 10 or 11?
Yes, but expect a rewrite rather than an upgrade. Drupal 7 modules use procedural code and APIs that no longer exist, so we document what each module does, check whether a contributed module now covers it, and rebuild only what is still needed using current architecture. Content and data are moved with the Migrate API, usually as part of a full site migration.
Should we use a contributed module or build a custom Drupal module?
Use a contributed module when a maintained one with security advisory coverage does what you need, even if you must adjust your process slightly. Build custom when the requirement is specific to your organization, when the only available module is unmaintained, or when bending a contributed module would take more code than writing a focused one. We review contributed options before quoting any custom work.
Will a custom Drupal module survive core updates?
A module built on Drupal APIs, with dependency injection, config schema and tests, normally runs through minor updates unchanged. Major versions remove deprecated code, so a module may need small edits, which Upgrade Status and Drupal Rector help identify. Modules that patch core behavior directly or rely on internal classes are the ones that break, and we avoid both patterns.
Does anyone still use Drupal for new projects?
Yes. Drupal remains common for universities, governments, nonprofits, publishers and larger organizations with complex content, permissions and multilingual needs. Drupal 11 is actively developed, and the Drupal CMS distribution launched in 2025 to make new sites quicker to set up. For a small brochure site Drupal is often more than you need, and we will say so.

Next step

Tell us what you want to grow

Send a few details and a senior strategist replies within one business day with honest next steps, even if we are not the right fit.

  • Free audit with a recorded video walkthrough
  • Fixed scope and published pricing
  • No long lock-ins: 3-month minimum on most retainers
  • You own every account, file and line of code

We only use your details to reply. See our privacy policy.