Google Cloud

A cloud platform built for the business you are growing.

Growth means more than traffic. More customers, locations and employees also bring new responsibilities, agreements and exceptions. We design cloud platforms to carry that growth while keeping the business logic coherent.

Point-of-sale data passes through a queue to processing tasks and comes together in the platform.Sales dataQueueProcessing

One data model for stores, brands and products

From our work · retail platform

Receiving data is not the same as processing it.

For a retail platform, we distributed point-of-sale data through Pub/Sub to background tasks. Stores, brands, products and employees came together in one data model.

Explore the retail platform

Model the business before selecting infrastructure

What constitutes a job? When is it accepted? Who can change it? When is delivery complete, and when is the financial work complete?

These questions determine the data model, APIs and validation. We make states and allowed transitions explicit so each application does not have to invent its own interpretation.

Shared business rules do not require one giant application. We separate responsibilities into understandable components and introduce independent services when scale, security or operating needs justify them.

Data storage that fits your business

We prefer a document-oriented NoSQL database. This stores related information, such as the details and status of a job, together in a single record. We use Firestore, a managed database service from Google Cloud, for this approach.

A relational database organises information in linked tables. We choose that approach when it better fits the relationships between records, calculations and reporting requirements. Cloud SQL provides that option within Google Cloud.

For either approach, we establish which changes must succeed together, how people retrieve information and how growth will affect speed and cost. The storage needs to serve the work the platform supports.

In practice: partner agreements and commissions

For an application and partner platform, we handled analysis, design and development of the portal and API. Partners and subpartners have individual terms governing commission tiers, calculation bases and costs. External application statuses are mapped to the portal’s own business states.

We built a Vue portal, an Express/TypeScript API and a relational model using Sequelize and MySQL, with configuration for App Engine and Cloud SQL. Related administrative changes in a commission batch are processed within one SQL transaction. This keeps the records consistent as a group; execution of a bank payment is a separate operation.

Development and testing need defined environments, identities and data. They should not depend on hidden access to production.

Give integrations an explicit processing model

For a platform serving brands and retail teams, we built point-of-sale import and conversion jobs. Pub/Sub distributed the processing across background tasks. Incoming records were associated with stores, brands, products and employees. Brand applications, team management and internal operations could then work with a shared meaning of the data.

Financial processing also had its own payout batches, recipients and processing statuses. These were distinct responsibilities, not a single long request trying to complete everything at once.

JobLog shows another application of this approach. Recurring work is processed in batches with progress, completion and errors recorded. The business agreement determines which tasks arise; processing makes their outcomes visible.

Scaling includes knowing the limits

Autoscaling can adapt compute capacity to demand. Concurrency and minimum/maximum instance settings affect performance and cost; Google recommends testing those settings before production use. Cloud Functions configuration guidance.

We connect those choices to actual scenarios: employees checking schedules at the start of a shift, or many jobs entering processing at once. We also examine the dependencies. A database, payment service or accounting API may hit its limit before the application server does.

Queues, bounded retries and monitoring are part of that design. Adding servers does not solve every bottleneck.

A notification may arrive twice. A charge should not.

Integrations have uncertain outcomes. A request can time out after the provider has already processed it. A webhook can be delivered again. Two users can change the same job almost simultaneously.

For critical actions, we design transaction identifiers, version checks and repeat-safe operations. An unknown outcome remains unknown until it is resolved; it is not treated as a failure that can simply be retried.

A database update and an external provider action are not automatically one transaction. Intermediate states, recovery and operational follow-up need an explicit design.

Modernise without discarding the business knowledge

Existing software often contains years of useful decisions. It does not always need wholesale replacement. We can clarify responsibilities, improve an integration layer and replace parts incrementally. Our work for a building materials supplier shows how we develop established business systems.

An architecture engagement delivers a system map, important design decisions, data and integration boundaries, and an implementation plan. In a build engagement, we implement and test that foundation. Capacity, recovery and support commitments are agreed for the operations the platform needs to carry. Quality and operating agreements define how your engineers and ours continue working with it.

Your next step

Looking for an engineering partner?

Tell us about the architecture question, integration or development work. We discuss dependencies and our role alongside your team.

Talk about your next step