← Back to blog

Magento Project Estimation: How to Get Realistic Numbers

Rodrigo Biazzi

Estimating a Magento project is hard for the same reasons Magento is powerful: almost anything can be customized, every store has a different mix of extensions and integrations, and the parts that look simple on a feature list often hide the most work. Estimates that are too low lead to cut corners and tense conversations. Estimates that are padded without explanation lose the deal or the trust.

This article describes how I approach estimates for Magento 2 and Adobe Commerce work, from a single feature to a full build or migration. It covers how to break work down, where the hidden effort usually sits, how to express uncertainty and what to put in writing.

Start with what you know about the codebase

On an existing store, an estimate without looking at the code is a guess. The same feature, say a custom field in checkout, can take very different effort depending on the theme, the checkout implementation, the extensions installed and the state of the code. Before estimating anything non trivial on an unknown store, I ask for repository access or do a short paid audit. It looks at:

  • Magento version, edition and PHP version, and how far behind the latest patch the store is.
  • Theme: Luma based, Hyvä or headless, and how much is overridden.
  • Third party extensions, how many, from whom and whether they are maintained. The process is in third party extension audit.
  • Custom modules: quality, use of plugins and preferences on core classes, tests.
  • Integrations: ERP, payment, shipping, marketplaces, and how they run.
  • Environments and deployment: is there a working local setup, staging and a repeatable deploy.

Missing local or staging environments, or a deploy that is done by hand on the server, are effort items in themselves. They should appear in the estimate, not be absorbed silently.

Break the work down until each piece is small

A line like "B2B features" or "ERP integration" cannot be estimated. Break each requirement into tasks small enough that you can picture the files you will touch. For a checkout field that is stored on the order and shown in the admin, for example:

  1. Schema change for quote and order columns, or extension attributes.
  2. Frontend field in the checkout layout and its JavaScript.
  3. Saving the value through the checkout API, with validation.
  4. Copying it from quote to order.
  5. Showing it in the admin order view, emails and order grid.
  6. Including it in the API or ERP export if needed.
  7. Tests and checking it with every payment method in use.

Each of those steps is a separate estimate, and some of them disappear or grow once the client answers a question. The breakdown also shows the client what they are paying for. The technique for that particular feature is in adding a custom checkout field.

Express uncertainty instead of hiding it

For each task, give three numbers: optimistic, most likely and pessimistic. The three point estimate, often called PERT, combines them:

expected = (optimistic + 4 * most_likely + pessimistic) / 6
spread   = (pessimistic - optimistic) / 6

As an illustration, a task with 4, 6 and 14 hours gives an expected value of 7 hours and a spread of about 1.7 hours. The point is not the exact math. It is that a wide gap between optimistic and pessimistic flags the tasks where more discovery would pay off. Those tasks are the ones to investigate before you commit to a number, or to scope as a separate phase.

Summing expected values gives a reasonable total for a project with many tasks. Adding a contingency on top only makes sense if it is visible and tied to named risks, not a silent multiplier.

Where Magento estimates usually go wrong

Integrations

The Magento side of an integration is usually predictable. The other side is not. Missing API documentation, sandboxes that behave differently from production, rate limits, and fields that mean different things to each system all add time that only shows up during testing. Estimate integrations with wide ranges, and separate the Magento work from the work that depends on the third party. The design side is covered in ERP integration patterns.

Data

Product imports, customer migration and order history take longer than expected because the source data is never as clean as the sample file. Duplicate SKUs, missing attribute values, images that do not exist and inconsistent encodings each need a decision from the client. Plan at least one full trial import and a round of fixes.

Extensions

Installing an extension is quick. Making it work with the theme, the checkout, other extensions and the client's real process is not. On Hyvä stores, check whether a compatibility module exists for each Luma extension. Without one, each extension frontend is its own small project.

Checkout and payments

Every change in checkout has to be tested with each payment and shipping method, guest and logged in, and on mobile. Payment providers add their own sandbox quirks. Checkout work deserves a higher pessimistic number than similar work elsewhere in the store.

Upgrades

Upgrade effort depends on the gap between versions, the number of extensions and the amount of custom code that touches changed core classes. An estimate that does not start from the extension list and a compatibility check is not useful.

Things nobody listed

Emails, PDF invoices, admin grids, ACL for new admin pages, translations for every store view, cache and indexer behavior, and deployment steps for schema changes. None of these is big, and together they add up. Keep a checklist and go through it for every feature.

Non development work

A good estimate includes the parts that are not writing code:

  • Discovery and clarifying questions.
  • Code review and fixes after review.
  • Testing by the developer and support for the client's acceptance testing.
  • Deployment, including off hours deploys if the client needs them.
  • Communication: meetings, status updates and documentation.

Leaving these out does not make them go away. It just moves them into overtime or into the next invoice, which is worse for everyone.

Fixed price or time and materials

Fixed price works when scope is clear and stable, the codebase is known and the main risks have been checked. It gives the client a predictable cost, and the provider carries the risk, which should be reflected in the price.

Time and materials works better for discovery, legacy codebases, integrations with unknown systems and ongoing maintenance. The estimate is still useful, as a budget and a plan, but the client pays for actual time and can change priorities along the way.

A practical mix is a fixed price discovery or audit phase, followed by estimates for clearly defined features, and time and materials for whatever stays uncertain. Each phase reduces the unknowns for the next one.

Put the assumptions in writing

The estimate document matters as much as the numbers. Include:

  • The task breakdown with ranges.
  • Assumptions, such as "the ERP provides a sandbox with test data" or "the existing payment module is compatible with 2.4.8".
  • What is out of scope, named explicitly.
  • Dependencies on the client, such as content, access, decisions and test feedback.
  • Known risks and what happens to the estimate if they come true.

When an assumption turns out wrong, the conversation is about a documented change, not about who misunderstood what. That protects the relationship more than an accurate number does.

Re-estimate as you learn

An estimate is a forecast, and it should be updated when new information comes in. Track actual time against estimates per task. Over a few projects, this shows where your own estimates are reliably low, which is the most useful input for the next one. If you are hiring rather than estimating, hiring a freelance Magento developer covers what to ask for when you receive an estimate.

FAQ

Why do Magento estimates vary so much between developers?

Different assumptions about the codebase, extensions, testing and non development work. Ask each developer for a task breakdown and their assumptions, then compare those instead of only the totals.

Can a Magento feature be estimated without seeing the code?

Only roughly. Theme, checkout implementation, extensions and code quality all change the effort. A short audit gives a much more reliable estimate.

Should I choose fixed price or time and materials for a Magento project?

Fixed price suits clear, stable scope on a known codebase. Time and materials suits discovery, legacy code, unknown integrations and ongoing work. Many projects combine both in phases.

What parts of a Magento project are most often underestimated?

Third party integrations, data migration, extension compatibility, checkout testing with every payment method, and non coding work such as review, deployment and communication.

I am available for freelance Magento and Adobe Commerce work, including audits and estimates for new projects. If you need help with this, get in touch.

Related articles