Start from where the work currently jams
The four business systems on this page are not packages to pick from a menu — they are the four shapes that work usually takes. If the jam is customers trying to reach you and staff answering the phone mid-service, that is booking automation. If it is unqualified enquiries arriving through five channels and the first call starting from zero, that is client intake. If nothing exists yet and you need evidence before spending more, that is an MVP build. If the process works but only when one specific person is present, that is an internal operations tool.
Most first versions are smaller than expected
Every business-systems page linked above has a section on what version one deliberately leaves out, because that is where these projects are won or lost. A booking flow does not need deposits, waitlists and loyalty points to be worth launching. An intake system does not need scoring before anyone has seen the raw enquiries. Cutting version two before estimating version one is the single habit that keeps a build launchable.
Integrations are the part that surprises people
The screens are rarely the expensive part. The expensive part is the payment provider, the point-of-sale system, the calendar, the messaging channel — each one a real dependency on software we do not control. When we quote, integrations are named individually rather than folded into a feature list, because that is where scope quietly grows.
If the product already exists, the question is which layer is failing
For the engineering group the first useful question is where the boundary sits. If other teams have to embed your code — native Android, native iOS, and a React Native, Flutter or Unity wrapper on top — that is SDK work, and the wrapper is usually where the time goes, because it has to forward calls and callbacks in the exact shape the host SDK expects. If the app already shows ads and the problem is what the ad request contains, when it fires, or which of Google Ad Manager, AdMob, IMA and GMA is involved, that is ad monetization and ad server integration. If the product itself works and the feature you want is a ranking, a match or a summary the current code cannot produce, that is the AI work.
SDK and ad work is verified against the artifact, not the source tree
Two facts decide how this work is run. Release builds on Android go through R8 and ProGuard, which can strip or rename a class an ad SDK resolves reflectively at runtime — so the debug build passes, the release build fails, and nothing in the source tells you which one you are looking at. And there is no unit test for whether the ad server received the parameter you think you sent. So verification means building the APK, AAB or framework and inspecting what is actually inside it, then making real ad requests and reading them. A unit test cannot catch a class that compiled cleanly and then got dropped from the shipped bundle.
Ordering is a requirement, not an implementation detail
Identity and signal enrichment has to be registered and ready before the ads SDK initializes, and that readiness has to be awaited rather than assumed. If it is not, the first ad request of the session goes out unenriched, nothing throws, no log line looks wrong, and the session simply earns less. The same applies per call site: enrichment has to happen at every ad request in the app, and a missed one is invisible unless you go looking for it. That is why listing every ad-request site in the app is part of the estimate rather than something discovered halfway through.