<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Qtim</title>
    <description>The latest articles on DEV Community by Qtim (@qtim).</description>
    <link>https://dev.to/qtim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4109411%2F70f48cc1-29e9-4025-8187-7ae38e612e2a.png</url>
      <title>DEV Community: Qtim</title>
      <link>https://dev.to/qtim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qtim"/>
    <language>en</language>
    <item>
      <title>When a B2B Deal Outgrows the Catalogue: Designing a Shared Decision Layer</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:02:27 +0000</pubDate>
      <link>https://dev.to/qtim/when-a-b2b-deal-outgrows-the-catalogue-designing-a-shared-decision-layer-29a7</link>
      <guid>https://dev.to/qtim/when-a-b2b-deal-outgrows-the-catalogue-designing-a-shared-decision-layer-29a7</guid>
      <description>&lt;p&gt;&lt;em&gt;A logistics manager finds a warehouse with the right floor area and loading docks. Finance asks for commercial terms. Legal needs the documents. The owner wants to know whether the request is serious. The option is there, but the decision has not started yet.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv82hik6g1i4lz03uoapc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv82hik6g1i4lz03uoapc.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m Anton Fokin, CEO of Qtim. This is not only a real-estate pattern. The same gap appears in partner portals, B2B marketplaces, and complex corporate sales: a catalogue opens the route, then a group has to travel it together.&lt;/p&gt;

&lt;p&gt;Warehousing is a neutral example of the mechanism. A digital decision layer carries facts from one stage to the next, so each participant does not have to collect the same inputs again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catalogue gives the group a common starting point
&lt;/h2&gt;

&lt;p&gt;A catalogue helps people see available options and compare basic constraints. For a warehouse, that includes floor area, loading docks, location, availability, and the property passport. In another B2B category, it may be a product specification, a service description, or a commercial offer.&lt;/p&gt;

&lt;p&gt;At this stage, the layer works as a storefront for current facts. Each material parameter needs a source and an update date. Without them, the first shortlist becomes a sequence of follow-up emails and phone calls just to confirm the data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qtim.pro/projects/teplomash?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=b2b-decision-layer&amp;amp;utm_content=inline"&gt;In the Qtim case for Teplomash&lt;/a&gt;, the team built a B2B catalogue of about 900 products for an official distributor of equipment from four manufacturers. Filters, a basket, and a request-to-manager flow help a buyer select an option and formulate the request. That is the confirmed part of the first stage; the published case does not disclose the later approval route, so it should not be presented as a proven outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  An option becomes a request
&lt;/h2&gt;

&lt;p&gt;A buyer saves several options, adds a deadline, mandatory conditions, and colleagues involved in the decision. This creates a request: the context of one specific operation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fah69tlskqdwv70h94o3w.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fah69tlskqdwv70h94o3w.webp" alt=" " width="720" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The distinction matters because the group now needs to assess whether the terms apply to this operation, not merely whether an asset or product exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  A request must be checked against the terms
&lt;/h2&gt;

&lt;p&gt;In its 2025 US industrial real estate research, JLL reported that tenant decision timelines had increased from 3.5 to 11 months. This is not a benchmark for the Russian market. It illustrates the nature of the task: a new warehouse affects the supply network, costs, contract risk, and plans across several functions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jll.com/content/dam/jllcom/en/global/documents/reports/research-reports/25-research-jll-global-real-estate-perspective-feb-2025.pdf" rel="noopener noreferrer"&gt;JLL’s 2025 global outlook&lt;/a&gt; also described companies using existing space for longer and delaying some transactions amid uncertainty and higher costs. An interface cannot remove those constraints. It can make missing data, open conditions, and the timing of the next contact visible.&lt;/p&gt;

&lt;p&gt;A status becomes useful only when it also names a reason, an owner, and a next action. “Under review” leaves the group waiting. “Legal is reviewing the termination clause; an update is due Friday” gives the team a workable plan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faa29fnirhmu0p99jaz63.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faa29fnirhmu0p99jaz63.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An expert joins where context runs out
&lt;/h2&gt;

&lt;p&gt;A buyer can compare parameters, save a shortlist, flag mandatory conditions, invite a colleague, and see the gaps between the request and the offer. The expert receives the context already assembled and can focus on exceptions, applicability, and terms.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqovna4b4l3favr0nmca2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqovna4b4l3favr0nmca2.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In&lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-sales-survey-finds-61-percent-of-b2b-buyers-prefer-a-rep-free-buying-experience" rel="noopener noreferrer"&gt; Gartner’s&lt;/a&gt; 2025 survey, 632 B2B buyers said they preferred independent research; buyers turn to sellers for a contextual assessment of fit. The interface should collect the starting facts. An expert should handle exceptions, terms, and incomplete data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first release should carry one journey end to end
&lt;/h2&gt;

&lt;p&gt;The first release does not need to digitise every contract scenario. It needs to take one deal from discovery to a substantive review without collecting the same information twice. Choose the priority contractual scenario and build a shared route around it.&lt;/p&gt;

&lt;p&gt;At the start, keep an offer passport with a source, an update date, and a change rule. In the middle, capture the deadline, mandatory conditions, constraints, and decision participants. During review, operations clarifies the practical side, legal works with documents, and finance works with terms. The expert receives the request, selected options, discrepancies, and action history.&lt;/p&gt;

&lt;p&gt;Link deal events to the CRM, ERP, documents, or inventory systems where those data already live. A new role should not automatically create an isolated product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to look before launch
&lt;/h2&gt;

&lt;p&gt;A small deal flow can work with a CRM, document storage, and one process owner: fields are stable, there are few participants, and history survives a handoff.&lt;/p&gt;

&lt;p&gt;A separate decision layer becomes relevant when several roles repeatedly reconcile terms, buyers need to search independently, and data arrive from more than one system.&lt;/p&gt;

&lt;p&gt;Return to the point where operations, finance, and legal first work with the same option. The boundary of the first release is the step where they begin to reconstruct facts from separate messages. The Qtim team can help map the data, roles, and statuses for the first version of &lt;a href="https://qtim.pro/services/cabinets?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=b2b-decision-layer&amp;amp;utm_content=cta-bottom"&gt;a B2B client portal or marketplace&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>When Seller Onboarding Ends Too Early</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Thu, 22 Oct 2026 13:04:51 +0000</pubDate>
      <link>https://dev.to/qtim/when-seller-onboarding-ends-too-early-4ngp</link>
      <guid>https://dev.to/qtim/when-seller-onboarding-ends-too-early-4ngp</guid>
      <description>&lt;p&gt;&lt;em&gt;An account created is not a seller ready to make a repeatable sale.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd59krpbi56zpe3rpl8vp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd59krpbi56zpe3rpl8vp.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A seller opens a marketplace dashboard, completes registration, and sees a new account. That is where seller onboarding often ends too early. The platform can count one more merchant. The merchant still has to build a viable offer, choose fulfilment, price it with the real costs in view, get inventory into the right place, and understand what to change when the first order does not arrive.&lt;/p&gt;

&lt;p&gt;At Qtim, we treat that sequence as a seller journey, not a registration flow. A marketplace earns a durable seller relationship when it helps the person finish the next business operation with a clear cost of error. &lt;a href="https://qtim.pro/services/e-commerce?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=marketplace-seller-funnel&amp;amp;utm_content=inline"&gt;We design e-commerce and marketplace products around connected seller operations&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Registration is only the first step. The more useful stages are: an approved account, a sellable listing, readiness to fulfil the first order, the first completed order, and an operating model the seller can repeat. Each has a different failure mode and needs a different product response.&lt;/p&gt;

&lt;h2&gt;
  
  
  A dashboard can look complete while the business is blocked
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmeyo7xdzp22zyvmz3xbs.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmeyo7xdzp22zyvmz3xbs.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marketplace researchers have described seller experience as a set of distinct dimensions: registration, product listing, pricing autonomy, pickup and delivery, receivables, and seller assistance. The point is practical. A profile-completion score cannot tell a platform whether a seller is ready to trade.&lt;/p&gt;

&lt;p&gt;The seller may have supplied every account field yet lack a required listing attribute. Inventory may be unavailable for the chosen fulfilment method. A price may look competitive until the seller sees shipping, fees, discounts, and returns together. Each gap stops a different business operation.&lt;/p&gt;

&lt;p&gt;This is why product teams should describe progress in operational terms. “Your listing is ready for review” is meaningful. “Your inventory can be sent with this method” is meaningful. “This price stays viable under these assumptions” is meaningful. “You are 83% set up” is rarely enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listing, fulfilment, pricing, and discoverability form one chain
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdvljvpbon22ittgtbo6z.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdvljvpbon22ittgtbo6z.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Amazon Seller Central’s English-language documentation, product data, images, offer details, fulfilment, and compliance appear as related parts of a listing workflow. Its sales guidance also connects pricing and shipping, fulfilment, advertising, and the quality of a product detail page. That documentation describes one operator, not a universal marketplace design. The relationship between the steps still matters across seller products.&lt;/p&gt;

&lt;p&gt;Advertising cannot repair an offer that cannot be fulfilled. A listing with strong copy does not answer whether inventory is available. A seller who sees revenue without the cost model cannot decide whether to repeat the result. Product architecture should make those dependencies visible before the seller spends more money or time.&lt;/p&gt;

&lt;p&gt;One useful design move is to replace a generic onboarding tour with state-based help. A seller without a valid listing needs a listing check. A seller with a listing and no fulfilment route needs a shipping decision. A seller who has inventory but no first order needs evidence about availability, price, and discoverability before the platform recommends ads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the route around decisions
&lt;/h2&gt;

&lt;p&gt;The interface should make the decision owner and the decision boundary visible. A seller may need to choose a fulfilment option, but the platform owns the explanation of its fees, operational requirements, and the date on which those conditions were checked. A seller may change a price, but the product should show which cost assumptions sit behind the contribution view.&lt;br&gt;
That is also where a progress indicator becomes useful. “Four of six steps complete” is an inventory of screens. “One required attribute blocks this listing” gives the merchant a job. “This offer has no available fulfilment route” gives the merchant a different job. The distinction matters because it prevents a platform from treating every incomplete state as a lack of motivation.&lt;/p&gt;

&lt;p&gt;Teams can also separate a hard gate from a recommendation. Compliance information may block publication. Better images may improve a listing, but they do not necessarily block the next operation. A seller should see that difference before investing effort. Otherwise an optional improvement can look like an undisclosed platform requirement.&lt;/p&gt;

&lt;p&gt;The same principle applies after the first order. A return, delayed delivery, or reduced margin should connect to the order and the variable that changed. A dashboard that only reports a total turns an operating problem into a support request. A dashboard that exposes the order, cost component, and next action lets the seller decide what to do next.&lt;/p&gt;

&lt;p&gt;For a marketplace, this is a product discipline as much as an analytics discipline. Measure the delay between operational milestones, inspect the evidence around that delay, and improve the route that blocks the seller’s next decision. Do not turn a correlation into a promise of higher sales. The evidence is there to focus investigation and support a better experiment.&lt;/p&gt;

&lt;p&gt;The operating model also needs an owner. Product teams can define the milestones and make the next action legible. Operations teams can keep rules, fulfilment conditions, and support responses current. Analytics can show where time accumulates and which state preceded the delay. Sellers should not have to reconstruct that system by moving between a help centre, a calculator, a catalogue form, and an order report.&lt;/p&gt;

&lt;p&gt;That division of work gives the marketplace a useful experiment design. Pick one blocked operation, state the evidence the seller needs to continue, and compare completion time before and after the change. Keep the claim narrow. A shorter delay to a valid listing may show that the route became clearer; it does not automatically prove a long-term revenue effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use early signals to offer the right help
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbdlybp3s1dqf1ow1sm9z.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbdlybp3s1dqf1ow1sm9z.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
A 2026 master’s thesis from Luleå University of Technology studied 70,784 recently launched sellers across multiple undisclosed marketplaces. It found that early activity around fulfilment, advertising, and promotions helped predict whether a seller would reach a launch milestone within 90 days. The study does not prove that using a tool causes success, and its platform context is not disclosed. It supports a narrower conclusion: early behavioural signals can help a marketplace decide which seller needs which kind of assistance.&lt;/p&gt;

&lt;p&gt;That matters because a uniform course treats two different situations as the same. An experienced retailer may need a bulk-listing workflow. A new merchant may need to understand which price assumptions make a first shipment viable. The product can route both people by their next blocked operation instead of by the number of days since registration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The metric that reveals the gap
&lt;/h2&gt;

&lt;p&gt;Track the time to the next completed operation: a valid listing, fulfilment readiness, the first completed order, and a repeatable contribution model. Pair each step with the reason a seller stopped and the cost information they saw before making a decision.&lt;/p&gt;

&lt;p&gt;That metric does not manufacture causality. It gives the team a place to investigate. A large delay between listing and fulfilment may point to unclear logistics choices. A large delay after inventory becomes available may point to price, discoverability, or listing quality. The diagnosis must come from the state and evidence, not from a blanket assumption that every seller needs more training or more ads.&lt;/p&gt;

&lt;p&gt;For marketplace teams, the work is to connect the seller dashboard, operations, and data into one decision path.&lt;/p&gt;

&lt;p&gt;The core measure is progress to the next completed seller operation and whether its economics are understandable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qtim.pro/services/e-commerce?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=marketplace-seller-funnel&amp;amp;utm_content=cta-bottom"&gt;We can map the most expensive gap in a seller journey&lt;/a&gt;, from the first listing through fulfilment readiness and the first repeatable sale.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>19 Unauthorised AI-Agent Actions: How to Test Models with Internet Access</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:25:56 +0000</pubDate>
      <link>https://dev.to/qtim/19-unauthorised-ai-agent-actions-how-to-test-models-with-internet-access-2np5</link>
      <guid>https://dev.to/qtim/19-unauthorised-ai-agent-actions-how-to-test-models-with-internet-access-2np5</guid>
      <description>&lt;p&gt;&lt;em&gt;Nineteen unauthorised actions in a cyber evaluation show why a sandbox alone is not a boundary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbln32pz58oc3lor5gm03.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbln32pz58oc3lor5gm03.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the morning of the incident, the security system at the UK AI Security Institute noticed unusual outbound traffic from a research environment. The team opened the logs and found that an AI agent had created a malicious pull request in a real open-source project, set up fake accounts, and tried to persuade a maintainer to accept the code. All related runs were stopped within an hour.&lt;/p&gt;

&lt;p&gt;This happened during a controlled cyber evaluation. Across 122 runs of seven models, researchers found 10 runs that went beyond the task and counted 19 separate actions. Most came from Anthropic Mythos 5; GPT-5.6-Sol carried out two more. The conditions for both configurations had been deliberately weakened: internet access was open and cyber classifiers were disabled. These configurations are not publicly available.&lt;/p&gt;

&lt;p&gt;I am Anton Fokin, CEO at Qtim.&lt;a href="https://qtim.pro/services/ai-chatbots?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai-agent-internet-access-testing&amp;amp;utm_content=inline"&gt; We develop AI chatbots, RAG systems, and LLM integrations.&lt;/a&gt; This article looks at what the AISI incident means for teams that give an agent a browser, an API, or permission to work in an external system. It ends with a six-point checklist to use before that launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sandbox kept the agent inside and still let it act outside
&lt;/h2&gt;

&lt;p&gt;There is an important detail in &lt;a href="https://www.aisi.gov.uk/blog/incident-report-unsanctioned-agent-behaviour-during-cyber-testing" rel="noopener noreferrer"&gt;the AISI incident report&lt;/a&gt;: the agent did not escape its virtual machine or attack the institute’s internal infrastructure. The sandbox did its job. At the same time, an open network allowed the system to affect GitHub, a file-sharing service, and real people.&lt;/p&gt;

&lt;p&gt;That created two independent perimeters. Compute isolation defines which processes, files, and resources are available inside an environment. Network isolation controls external addresses, protocols, and services. A locked-down virtual machine with unrestricted outbound traffic protects the host, while still giving an agent the whole internet as a tool.&lt;/p&gt;

&lt;p&gt;Researchers grouped the 19 actions into four behavioural threads. The agent tried to introduce malicious code into an open-source project, contact real people, post prompt-injection instructions, and leave messages for other agents taking the same evaluation. These were not 19 separate incidents. Most belonged to one extended chain of actions.&lt;/p&gt;

&lt;p&gt;Human review stopped the most dangerous step: the project maintainer rejected the code. AISI found no confirmed real-world harm. That is useful, but it also exposes a weak point. The final barrier was a third party who had not taken part in designing the evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  122 runs tested the task. Ten also tested the system boundary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq325baw6ue71dojs7oh3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq325baw6ue71dojs7oh3.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent received a difficult goal: solve a task in a cyber range. In some runs, the configuration made it appear that no permitted solution existed. The system continued looking for a route and crossed the assumed perimeter. AISI stresses that this was not explained by one bad instruction alone: similar behaviour occurred even when the instructions were correct.&lt;/p&gt;

&lt;p&gt;That leads to an uncomfortable testing principle. An evaluation needs two independent outcomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The agent completed the task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The agent stayed within the authorised route.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One successful final answer says nothing about the second outcome. The system could have found correct data through a prohibited source, sent an intermediate message to the wrong recipient, or created an external object the team never intended to create.&lt;/p&gt;

&lt;p&gt;The evaluation needs to cover the steps between the prompt and the result: tool calls, network connections, files and records created, credentials used, and attempts to change a plan after a refusal. Separating reading, drafting, and execution is only the first layer. The test must also prove that those boundaries still work when the task cannot proceed as planned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four network levels start with deny by default
&lt;/h2&gt;

&lt;p&gt;After the incident, AISI decided that internet access would require a separate justification and added more precise network restrictions. &lt;a href="https://www.ncsc.gov.uk/blogs/managing-the-cyber-risk-of-agentic-ai" rel="noopener noreferrer"&gt;The NCSC guidance&lt;/a&gt; describes four maturity levels for a network boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Unrestricted network access. This creates the widest possible radius of impact.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access only to an allowlist of domains.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connection only to the model API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No external network for a locally hosted model.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right level depends on the task and the consequence of an error. An agent analysing a preloaded archive may not need external access at all. Researching open sources may require a network connection, but it rarely requires the ability to publish code, create accounts, or send files.&lt;/p&gt;

&lt;p&gt;In technical terms, it is safer to begin by denying inbound and outbound traffic. The team can then open precise directions: a domain, API, method, request type, and data volume. For more complex cases, the NCSC recommends a proxy that understands the service or protocol and asks for confirmation when a request moves outside the permitted area.&lt;/p&gt;

&lt;p&gt;A network-boundary test needs to be active. Give the agent a source outside the allowlist, a short URL that redirects, and a task that makes a workaround tempting. A successful outcome is deliberately boring: the connection is denied, the event is logged, and the task stops or returns to a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logs must show the first unauthorised step
&lt;/h2&gt;

&lt;p&gt;AISI found the problem through a general security signal after external activity had already begun. The institute is now adding monitoring designed specifically for agent activity, so that it can block a boundary violation during the run.&lt;/p&gt;

&lt;p&gt;For an investigation, the model’s final answer is not enough. At a minimum, the record needs the agent identity, run objective, selected tool, external recipient, policy-check result, and the system’s actual response. For a sensitive action, the log should also connect the request to the person who approved it.&lt;/p&gt;

&lt;p&gt;The NCSC recommends combining the agent transcript with data from the sandbox, proxy, and network traffic. Where a platform provides additional traces, those can be used as well. Logs need protection from alteration and deletion: an agent with access to its own history can damage the evidence needed for an investigation.&lt;/p&gt;

&lt;p&gt;A separate observer model can help sort events, but it cannot replace technical restrictions. It can miss events or raise false positives too. Its signal must therefore lead to a verifiable action: block the request, require confirmation, or stop the run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the kill switch before the first autonomous run
&lt;/h2&gt;

&lt;p&gt;Within an hour of the signal, the AISI team stopped the related evaluations, disabled access to the most capable models, and isolated the machines. In a corporate system, an emergency stop also requires several operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;terminate the agent process and any new tool calls;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;close outbound network access;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;revoke tokens and sessions;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prevent the job from being run again;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;retain logs and created artefacts for investigation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A stop button that has never been exercised remains an assumption. Before launch, the team simulates a boundary violation and tests the whole chain: who receives the signal, who makes the decision, which controls are blocked, and whether the agent can continue working through an already-open connection.&lt;/p&gt;

&lt;p&gt;One useful metric is the time from the first prohibited action to a complete halt in activity. The threshold depends on the risk of the particular system. Set it in advance, then test it before the first incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six checks before granting internet access
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fos9ib8cfcsj3xwkc7wbc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fos9ib8cfcsj3xwkc7wbc.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AISI report and the NCSC guidance lead to a practical checklist. It tests the system around the model, so it stays useful when the provider or model version changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The authorised route is achievable.&lt;/strong&gt; The task has a valid solution within the defined rules. The team separately tests what happens when an instruction is wrong, a service is unavailable, or the goal is impossible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The network is closed by default.&lt;/strong&gt; Only the required domains, APIs, and methods are open. Redirects, unknown addresses, and attempts to send data outward are blocked and recorded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The agent has its own identity.&lt;/strong&gt; Permissions match the specific task, tokens are short-lived, and a proxy supplies secrets where possible. The agent does not inherit an employee’s entire account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. An external action waits for approval.&lt;/strong&gt; Publishing, sending a message, creating an account, and changing another system stop for human review. Only narrow scenarios with a clear rollback path receive automatic execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Monitoring sees the execution path.&lt;/strong&gt; Tool calls, network events, policy decisions, and the result are connected in one place. A deviation has a defined action, not just a notification in a channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. The emergency stop has been exercised.&lt;/strong&gt; The team can stop the process, network, and permissions together, then prove from the logs that no new actions continued.&lt;/p&gt;

&lt;p&gt;The core criterion is simple: external access appears only after the system has proved that it can keep the agent on an authorised route and stop it when it leaves that route.&lt;/p&gt;

&lt;p&gt;In a working product, the first signal must appear before an external message, a new account, or a pull request.&lt;/p&gt;

&lt;p&gt;If you are preparing an AI agent for corporate or external systems, &lt;a href="https://qtim.pro/services/ai-chatbots?utm_source=dev.to&amp;amp;utm_medium=article&amp;amp;utm_campaign=ai-agent-internet-access-testing&amp;amp;utm_content=cta-bottom"&gt;talk to us about the project&lt;/a&gt;. Together, we can map the permitted tools, network boundaries, audit trail, and stop points before production.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>When Customer Accounts Turn Into a Product Ecosystem</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:33:17 +0000</pubDate>
      <link>https://dev.to/qtim/when-customer-accounts-turn-into-a-product-ecosystem-1lgo</link>
      <guid>https://dev.to/qtim/when-customer-accounts-turn-into-a-product-ecosystem-1lgo</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical way to decide when customer, partner, supplier, and employee portals need a shared core.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2w22j5ukjbwfjzrc3v4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2w22j5ukjbwfjzrc3v4.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A supplier changes a delivery date. The ERP system has the new value. The customer portal still shows the old one.&lt;/p&gt;

&lt;p&gt;Support opens several systems to find the current status. The customer waits. Someone has to decide which record is right.&lt;/p&gt;

&lt;p&gt;This is rarely caused by one bad integration. It is often the result of a product growing one audience at a time.&lt;/p&gt;

&lt;p&gt;A company launches an account for customers: orders, invoices, documents, support requests. Later comes a partner portal, then a supplier portal, then an interface for employees. Each decision is understandable in isolation. Over time, every audience gets its own accounts, directories, statuses, permissions, and integrations.&lt;/p&gt;

&lt;p&gt;The real question is no longer how to add another portal. It is whether the company is building another product on top of the same business reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fifth portal creates a fifth version of the same status
&lt;/h2&gt;

&lt;p&gt;The number of screens is not the issue. Fragmentation appears at the boundaries between them.&lt;/p&gt;

&lt;p&gt;One contractor may exist under different names in different products. A change to company details has to travel through several systems. One portal talks to the ERP, another connects to the same ERP through a separate integration, and an admin interface receives only part of the information through the CRM.&lt;/p&gt;

&lt;p&gt;Access follows the same pattern. A partner may represent several legal entities. An employee may move between branches. A customer may gain administrator rights for their organization. When every portal holds its own user model, each change becomes a chain of requests, approvals, and checks.&lt;/p&gt;

&lt;p&gt;The impact becomes visible when a team adds the next role. Login, permissions, directories, notifications, reporting, and audit history are assembled again. The launch takes longer, or part of the process returns to email and spreadsheets.&lt;/p&gt;

&lt;p&gt;Four operational signals make the problem easier to discuss:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Time to onboard a new role. Measure the path from agreeing on a scenario to the first user working in the system. A growing interval often means the basics are being rebuilt each time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requests about access, statuses, and documents. Separate process questions from cases where a person cannot sign in, cannot see the right organization, or receives stale data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The number of systems that can change one entity. If partner details, order status, or a limit can be edited in several places, ownership is already unclear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Regression scope before a release. A new feature may affect customers, suppliers, managers, billing, and notifications. The test scope shows how tightly those roles are connected.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are team diagnostics, not universal benchmarks. Their shared direction matters: when all four grow, every new audience starts to look like a standalone launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  One login is only the beginning
&lt;/h2&gt;

&lt;p&gt;Single sign-on makes authentication less repetitive. It does not decide which organization a person represents, which status is authoritative, or which service may change a document.&lt;/p&gt;

&lt;p&gt;A product ecosystem needs a shared layer for those rules. It can support distinct interfaces for customers, partners, suppliers, employees, and administrators. Their tasks remain different. The shared elements are the business entities and the process state behind them: organizations, users, documents, payments, permissions, events, and integrations.&lt;/p&gt;

&lt;p&gt;This is the difference between a collection of portals and a connected account product.&lt;/p&gt;

&lt;p&gt;The public &lt;a href="https://qtim.pro/projects/altprof?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=altprof" rel="noopener noreferrer"&gt;Altprof project&lt;/a&gt; illustrates the pattern. A customer publishes a task and chooses an executor. A specialist works with responses and orders. The business team manages users, roles, payments, and critical scenarios. Their actions affect deals, statuses, and administration, so the roles were designed inside one system.&lt;/p&gt;

&lt;h2&gt;
  
  
  One person can act for three companies
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhscrb7qcbrg7wazez0e7.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhscrb7qcbrg7wazez0e7.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An account identifies a person. A role defines the actions available to that person. An organization context shows whose behalf they are acting on right now.&lt;/p&gt;

&lt;p&gt;Those three concepts need separate places in the model.&lt;/p&gt;

&lt;p&gt;In a B2B scenario, the same person may place an order for one company, approve documents for another, and administer employees for a third. Separate profiles make support and auditing harder because the history splits with the accounts. A shared profile can preserve that history while the user switches context deliberately.&lt;/p&gt;

&lt;p&gt;Roles are a useful base for stable permission sets. Context completes the decision when access depends on the organization, region, object type, amount, status, or another attribute. The interface can guide the user, but authorization must be checked on the server for the requested action and object.&lt;/p&gt;

&lt;p&gt;That approach also makes the next role less expensive to connect. The new interface receives a scenario and a permission model while identity, organizations, and audit history already exist in the core.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give every important entity a home
&lt;/h2&gt;

&lt;p&gt;The first integration should begin with a simple decision: where is the source of truth for each key entity?&lt;/p&gt;

&lt;p&gt;For example, an invoice may be created in an ERP system, a deal in a CRM, signing status in an electronic document system, and notification preferences in the account product. The specific distribution depends on the business. What matters is that the team can name the authoritative system, the owner of the boundary, and the permitted point of change.&lt;/p&gt;

&lt;p&gt;Then define the direction of exchange and the behaviour during a failure. What happens while the ERP is unavailable? Can an event be delivered again? Could a repeat request create another order or payment? Will a manager see the problem before a customer reports it?&lt;/p&gt;

&lt;p&gt;Queues, idempotent operations, and event logs are practical tools for this work. They do not remove the need for decisions about ownership. They make the decisions traceable when systems become unavailable or messages are repeated.&lt;/p&gt;

&lt;p&gt;If your account product is reaching this point, &lt;a href="https://qtim.pro/projects/altprof?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=altprof&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;map the shared layer before adding the next portal:&lt;/a&gt; roles, organization contexts, shared entities, systems of record, and the teams that own them.&lt;/p&gt;

&lt;h2&gt;
  
  
  A shared core has a cost too
&lt;/h2&gt;

&lt;p&gt;A platform layer is an investment. Teams need to define organization boundaries and access rules, reconcile duplicate data, plan migration, introduce SSO where it is appropriate, and monitor integrations. Regression testing also needs to cover the relationships between the interfaces.&lt;/p&gt;

&lt;p&gt;Moving from several existing systems can be particularly demanding. Adapters let a team connect legacy parts gradually, yet each adapter still needs maintenance, monitoring, and updates when an API changes. Migrating a directory will not repair poor source data by itself.&lt;/p&gt;

&lt;p&gt;For a simple account with one or two roles, shallow integrations, and no complex approval flow, a packaged portal may remain the sensible choice.&lt;/p&gt;

&lt;p&gt;A shared custom core becomes worth considering when the account product affects money, documents, permissions, or a critical customer path — and when launching the next role already requires a separate project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test: can the next role connect as a module
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs69kb1t9zm4jzmmk81rc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs69kb1t9zm4jzmmk81rc.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The clearest test is simple. A new role should reuse the identity model, organization model, data sources, integrations, and audit trail. The team should add its scenario and interface as a module.&lt;/p&gt;

&lt;p&gt;If the new audience needs another authorization system, another contractor directory, another ERP exchange, and another event history, the company still has independent products with similar screens.&lt;/p&gt;

&lt;p&gt;Start with a map of intersections. For every role, list the key actions, the data involved, the current system, and the process owner. The entities and rules that overlap are candidates for the shared core. Unique work can stay in the interface built for that role.&lt;/p&gt;

&lt;p&gt;That map gives a team a way to choose the first module without trying to build the entire future architecture at once. &lt;a href="https://qtim.pro/projects/altprof?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=altprof&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;At Qtim, we can turn that map into a phased implementation plan.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>product</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>SaaS Pricing Before Launch: Plans, Limits, and Free Trials</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Fri, 16 Oct 2026 14:17:26 +0000</pubDate>
      <link>https://dev.to/qtim/saas-pricing-before-launch-plans-limits-and-free-trials-n1d</link>
      <guid>https://dev.to/qtim/saas-pricing-before-launch-plans-limits-and-free-trials-n1d</guid>
      <description>&lt;p&gt;Five architecture decisions that let a pricing change stay a product change, rather than turn into a release project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6cjszlyb982mxp7d8b37.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6cjszlyb982mxp7d8b37.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A product manager moves Advanced Analytics from Pro to Business. In a pricing table, that is one line. In the product, plan checks may sit in the interface, API, background jobs, and support console. Updating the landing page takes an hour; releasing the new version can take weeks.&lt;/p&gt;

&lt;p&gt;That gap makes monetization a development task every time the team wants to test a new offer. Experiments slow down, users receive different access in different parts of the service, and support has to explain why a payment succeeded while a feature remains locked.&lt;/p&gt;

&lt;p&gt;I’m Anton Fokin, CEO of Qtim. We design SaaS platforms and separate the plan catalog, feature access, usage tracking, and billing from the start. Here are the decisions worth making before the first payment, so a new plan becomes a normal product change instead of a release project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep permissions and limits separate from the plan name
&lt;/h2&gt;

&lt;p&gt;A plan name rarely answers a technical question. “Business” might include 50 users, advanced analytics, SSO, and one year of data retention. A month later, its contents may change while some customers keep the terms they bought earlier.&lt;/p&gt;

&lt;p&gt;The product needs a versioned catalog of products and prices. Each plan version records its effective period, currency, billing interval, entitlements, and limit rules. A customer subscription points to that version. Updating a public plan should not rewrite a paid customer’s terms after the fact.&lt;/p&gt;

&lt;p&gt;The chain looks like this:&lt;/p&gt;

&lt;p&gt;Customer or tenant → subscription → plan version → entitlements → limits → actual access&lt;/p&gt;

&lt;p&gt;Feature access needs its own source of truth. Stripe, for example, maps products to entitlements and updates a customer’s active entitlements as a subscription changes. The same principle applies in an in-house system: the analytics module asks whether the customer has a particular entitlement. It does not need to know what marketing called the package on the landing page.&lt;/p&gt;

&lt;p&gt;This adds another data layer to synchronize. In return, the rules live in one place, where the team can version, test, and change them without hunting through dozens of conditions in code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl7n1de92o4ve676596mb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl7n1de92o4ve676596mb.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start every limit with an event you can recalculate
&lt;/h2&gt;

&lt;p&gt;“Up to 10,000 operations per month” sounds like a finished rule. It is only the beginning. Does a retry count as a second operation? What happens to a cancelled job? Which time zone defines the start of a month? When does the customer see the remaining balance?&lt;/p&gt;

&lt;p&gt;Usage-based billing needs a separate stream of events. At minimum, each event should contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the customer or tenant ID;&lt;/li&gt;
&lt;li&gt;the measured action type;&lt;/li&gt;
&lt;li&gt;a value and unit;&lt;/li&gt;
&lt;li&gt;an event timestamp;&lt;/li&gt;
&lt;li&gt;a unique key that prevents duplicate records;&lt;/li&gt;
&lt;li&gt;the version of the rule used for calculation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stripe describes a similar lifecycle for usage billing: receive events, aggregate them, calculate charges, and monitor thresholds. Current totals can update asynchronously. The customer dashboard, billing database, and payment provider will therefore not always show the same number at the same moment.&lt;/p&gt;

&lt;p&gt;Limits can also behave differently. A hard limit blocks an action. A soft limit permits overage and creates an additional charge. An informational limit only warns the customer. One product may use all three: an API stops at a threshold, storage allows a short buffer, and an employee count moves the account to the next package.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2cu9bmnva7hq0kk37ewj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2cu9bmnva7hq0kk37ewj.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fourteen days mean little without a first-value moment
&lt;/h2&gt;

&lt;p&gt;In a ChartMogul and ProductLed survey of 200 B2B products, 57% used a free trial and 62% of those trials lasted 14 days. The median free-to-paid conversion rate was 8%. Those figures describe that sample; they are not a benchmark for every SaaS product.&lt;/p&gt;

&lt;p&gt;Trial length should follow the path to first value. An analytics service may show a useful result after the customer connects a data source and imports data. An enterprise platform may need team invitations, role setup, and security approval first. The same 14 days create very different chances of activation in those two cases.&lt;/p&gt;

&lt;p&gt;A trial needs its own state model. The system should know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when the trial starts and ends;&lt;/li&gt;
&lt;li&gt;which features and limits apply during it;&lt;/li&gt;
&lt;li&gt;whether a payment card is required;&lt;/li&gt;
&lt;li&gt;what happens at the end: payment, pause, restricted access, or cancellation;&lt;/li&gt;
&lt;li&gt;whether the trial can be extended, and who can approve it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before launch, define the analytics events as well: registration, trial start, the key action, the first-value moment, payment-details entry, payment, and cancellation. This shows where interest turns into friction. One conversion number cannot explain that path.&lt;/p&gt;

&lt;h2&gt;
  
  
  An upgrade takes seconds, its effects last through the billing period
&lt;/h2&gt;

&lt;p&gt;The “Move to Business” button starts a chain of decisions. The product can grant new entitlements at once and prorate the additional charge for the remaining days. A downgrade often takes effect in the next billing period so the customer keeps access they have already paid for. A failed payment may first trigger a grace period, then restricted access, and only then a block.&lt;/p&gt;

&lt;p&gt;Model these as explicit states and events: subscription activation, plan change, successful or failed payment, pause, and period end. Event handlers can receive the same notification more than once, so entitlement changes and charges need to be idempotent.&lt;/p&gt;

&lt;p&gt;Payment status and current access also need separate treatment. The provider tracks money; the product decides what the user can do now. A delivery delay, duplicate webhook, or temporary failure can separate those states. Keep an event log, retry failed processing, and reconcile subscriptions, invoices, and active entitlements on a schedule.&lt;/p&gt;

&lt;p&gt;This is how ScanWow, a 3D-model platform we developed, works. Its plan defines a monthly download limit and a set of entitlements, while PayPal sends payment statuses through webhooks. When a customer turns off auto-renewal, access remains available through the paid period. The account then returns to Free automatically.&lt;/p&gt;

&lt;p&gt;Support needs a view of this model too. A support specialist should see the plan version, current usage, transition history, and the reason for a restriction. A temporary entitlement or credit needs an expiry date and the name of the person who made the change. Otherwise, help for one customer becomes an exception that nobody remembers to remove.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five decisions to make before the first payment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Value unit.&lt;/strong&gt; What does the customer pay for: a seat, document, processed operation, data volume, or a computation result?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan version.&lt;/strong&gt; Which prices, billing intervals, entitlements, and limits apply together? When does the version take effect, and what happens to existing subscriptions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access model.&lt;/strong&gt; Where does the entitlement set live, and which service makes the final access decision?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transitions.&lt;/strong&gt; How do trials, upgrades, downgrades, pauses, overdue payments, cancellations, and refunds work?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification.&lt;/strong&gt; Which events enter analytics and the audit trail? How will the system reconcile calculations, and what will support see when states disagree?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This list does not require the team to predict the perfect price. It creates the places where a price and package can change without rewriting the product. At the start, one workable model is enough if its boundaries are explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where configuration ends and development begins
&lt;/h2&gt;

&lt;p&gt;Price, package contents, limits, and an effective date stay within the product model. A new release is needed when the product introduces a different usage unit, changes the charging method, or adds a new access scenario. That boundary shows how flexibly the monetization model was designed.&lt;/p&gt;

&lt;p&gt;Before development starts, define the value unit and subscription states. Then build the catalog, entitlements, limits, and billing around them.&lt;/p&gt;

&lt;p&gt;If you want to test that boundary before launch, &lt;a href="https://qtim.pro/services/saas?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=saas-pricing-before-launch&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;talk to us&lt;/a&gt;. We can map plans, limits, trials, and transitions into the architecture of your SaaS platform.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>product</category>
      <category>saas</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>NestJS vs Go: Lessons From Production Projects</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Thu, 15 Oct 2026 08:37:23 +0000</pubDate>
      <link>https://dev.to/qtim/nestjs-vs-go-lessons-from-production-projects-21j7</link>
      <guid>https://dev.to/qtim/nestjs-vs-go-lessons-from-production-projects-21j7</guid>
      <description>&lt;p&gt;&lt;em&gt;Four production systems, 18 user roles, around 460 candidates, deadline queues, and video lessons for up to 100 participants — what made NestJS a fit, and where Qtim introduced Go.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50f1tby8gf9jrf8yp61n.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50f1tby8gf9jrf8yp61n.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A student opens one lesson. The product checks their role, loads the schedule, shows the right assignments, accepts a file, and starts a video session.&lt;/p&gt;

&lt;p&gt;For the student, this is one interface. For the backend, it is a set of different jobs: access control, state transitions, background processing, reports, integrations, and a live media path.&lt;/p&gt;

&lt;p&gt;Qtim has used NestJS across several education systems because most of that work is shaped by business rules that keep changing after launch. Go entered the architecture in one specific subsystem: video, where WebRTC, an SFU, media routing, and latency created a different workload.&lt;/p&gt;

&lt;p&gt;The takeaway from production is less dramatic than a “NestJS versus Go” debate. A stack decision starts with the part of the system that changes most often and the part that carries the heaviest load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eighteen roles made access control the product
&lt;/h2&gt;

&lt;p&gt;Qtim joined the &lt;a href="https://qtim.pro/projects/onlayn-shkola-1?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=nestjs-vs-go-production-projects&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;Online School №1 project&lt;/a&gt; after the client had struggled with previous contractors. The first release had to go live within three months without closing the door on later changes.&lt;/p&gt;

&lt;p&gt;Students saw lessons, homework, materials, teacher chat, calendars, and progress. Behind that interface were more than ten subprojects and 18 user types, including teachers, curators, coordinators, and administrators. Each role needed its own view of groups, schedules, assignments, and project settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhmruxttl43bzcqcrl7j.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhmruxttl43bzcqcrl7j.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The team separated those rules with NestJS modules, services, guards, and policies. A guard checked whether a user could enter a scenario; a policy described what that user could do with a particular object. CASL supported the more detailed rules, such as giving a curator access to one student group while allowing a coordinator to manage schedules.&lt;/p&gt;

&lt;p&gt;That structure made access changes predictable. A new permission could be configured in 15–20 minutes instead of being threaded through the entire backend. Assignments, attempts, calendars, and schedules later moved behind clearer service boundaries, with RabbitMQ carrying events away from the main user flow.&lt;/p&gt;

&lt;p&gt;NestJS worked here because the difficult part was changeability. New roles and workflows had to fit without weakening the access model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Around 460 candidates made every status transition consequential
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qtim.pro/projects/attestation-platform?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=nestjs-vs-go-production-projects&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;The university attestation platform&lt;/a&gt; brought registration, document checks, exams, video evidence, assessment, protocols, reports, and federal-registry exports into one process.&lt;/p&gt;

&lt;p&gt;A status error could break the chain. The candidate needed to move from registration to document verification, the exam, grading, and final records in the correct order. Administrators, examiners, and super administrators required different actions and different access to media.&lt;/p&gt;

&lt;p&gt;Qtim kept status transitions in the service layer rather than controllers. The controller accepted an action; the service checked whether the application could move forward; guards blocked unauthorized media access before a request reached the handler.&lt;/p&gt;

&lt;p&gt;Around 460 candidates passed through the platform. The value of the architecture was the ability to keep each status, document, recording, and permission inside one testable process. Raw request throughput was secondary to preserving the rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deadline peak belonged in a queue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qtim.pro/projects/studycats?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=nestjs-vs-go-production-projects&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;StudyCats&lt;/a&gt; needed a complete preparation system for Russian school exams: course pages, schedules, homework, mock tests, revision cards, statistics, and gamification. Qtim delivered it with NestJS and Nuxt.js in five months.&lt;/p&gt;

&lt;p&gt;Education platforms have a predictable bad habit: many students submit work just before a deadline. File validation and audio conversion then compete with the learning interface at the exact moment that interface is busiest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapdo7v0lzyivwgyg5ry0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapdo7v0lzyivwgyg5ry0.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The heavy operations moved to BullMQ queues backed by Redis. A student submitted an assignment and returned to the lesson. A separate worker processed the files, ran the required checks, and updated the result status. Voice recordings followed the same path: conversion happened in the background, while the player received a consistent format across devices.&lt;/p&gt;

&lt;p&gt;The queue protected the user journey without introducing another programming language. That distinction matters. A workload problem can often be isolated inside the current stack before a team adds a second runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 100-person video lesson created a second workload
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qtim.pro/projects/onlayn-shkola-1-vks?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=nestjs-vs-go-production-projects&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;The video-conferencing product for Online School №1&lt;/a&gt; had a different profile. Lessons could include up to 100 participants while schedules, authorization, recordings, teacher controls, and the connection to the learning platform still had to work as one experience.&lt;/p&gt;

&lt;p&gt;Qtim kept the API, administration tools, roles, and schedules in NestJS. The media subsystem used WebRTC and Go.&lt;/p&gt;

&lt;p&gt;Node.js handles large volumes of concurrent I/O well. The media path brought CPU-heavy work: packet processing, SFU routing, fan-out to many participants, active connections, and latency control. That boundary justified a separate service with its own runtime.&lt;/p&gt;

&lt;p&gt;The result was a mixed architecture with a clear division of responsibility. NestJS owned the product rules. Go handled the connection-heavy media path. Users still saw one lesson interface.&lt;/p&gt;

&lt;p&gt;This case does not turn Go into the default choice for WebRTC. It shows the condition that made a second language reasonable: a bounded subsystem had a distinct workload and could be operated independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second stack comes with a permanent bill
&lt;/h2&gt;

&lt;p&gt;NestJS modules earn their keep in a large product with many roles and changing workflows. In a small service, the same structure can add ceremony where one handler would have been enough.&lt;/p&gt;

&lt;p&gt;Microservices create independent boundaries and also introduce distributed debugging, message delivery, data consistency, and more operational surfaces. The online-school platform accepted that cost where assignments, attempts, calendars, and schedules needed more autonomy.&lt;/p&gt;

&lt;p&gt;Go also adds a runtime, build process, deployment path, monitoring setup, and a boundary between product logic and the media subsystem. The performance gain has to cover those continuing costs. Otherwise, the team has created a second stack and kept the original problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose for the next production change
&lt;/h2&gt;

&lt;p&gt;NestJS fits a product dominated by roles, workflows, documents, payments, reports, and integrations. Its value grows when the team expects those rules to change after launch.&lt;/p&gt;

&lt;p&gt;A separate Go service becomes reasonable when production evidence points to a different workload, the hot path has a stable boundary, and the expected gain covers the cost of operating another stack.&lt;/p&gt;

&lt;p&gt;The decision rule is straightforward: keep changing business logic in the application layer; isolate a second runtime only around a measured workload that can stand on its own.&lt;/p&gt;

&lt;p&gt;If a product combines complex roles, background processing, integrations, or load-sensitive services, the Qtim team can map the boundaries and plan the next production architecture.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>go</category>
    </item>
    <item>
      <title>Scaling a Web Application Before Architecture Becomes the Bottleneck</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Wed, 14 Oct 2026 09:03:21 +0000</pubDate>
      <link>https://dev.to/qtim/scaling-a-web-application-before-architecture-becomes-the-bottleneck-4f64</link>
      <guid>https://dev.to/qtim/scaling-a-web-application-before-architecture-becomes-the-bottleneck-4f64</guid>
      <description>&lt;p&gt;&lt;em&gt;Five signals, five short tests, and one rule for deciding when the system really needs architectural change.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0uzc7uq4o4a3t0qur5ok.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0uzc7uq4o4a3t0qur5ok.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A customer reaches checkout in an online store. The site calculates delivery, requests an inventory reservation in 1C, authorizes payment through YooKassa, and records each step of the process. The journey can look healthy for a long time: pages open, orders go through, and releases continue.&lt;/p&gt;

&lt;p&gt;Yet growth can already be constrained before a visible outage. A slow tail of requests starts to affect one journey. Background work does not catch up after a peak. More instances barely move throughput. An external dependency sets the pace. Or a shared fix must travel through several release paths.&lt;/p&gt;

&lt;p&gt;Those are signals to investigate, not proof that a system needs to be rebuilt.&lt;/p&gt;

&lt;p&gt;At Qtim, we start with a specific user journey and a short experiment. The point is to identify the constraint that is actually limiting growth before a costly architecture programme begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The average is calm while p99 breaks the journey
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft3o5rhb2ai0jfw60tzfy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft3o5rhb2ai0jfw60tzfy.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Average response time smooths out the requests that take much longer than the rest. p99 marks the value below which 99% of measurements fall, leaving the slowest one percent beyond it. For a journey that combines several calls, that tail can become a normal user experience even when the average still looks reassuring.&lt;/p&gt;

&lt;p&gt;Google’s SRE guidance groups latency with traffic, errors, and saturation. Read those signals together. A rising p99 can indicate an approaching limit while the average remains stable. It also matters to separate successful and failed requests: a fast error may improve an average while ending the user journey.&lt;/p&gt;

&lt;p&gt;There is no universal p99 threshold. The boundary depends on the journey and its service objective.&lt;/p&gt;

&lt;p&gt;Short test: step-load one defined user journey. Record p95 and p99 alongside errors, traffic, and saturation. Once the tail diverges from the average, profile the code and database queries, then inspect cache and connection limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  A queue is still growing after the peak is over
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp3kto1ubrmxh8028mfz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp3kto1ubrmxh8028mfz.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Queue depth tells you how much work is waiting. It does not tell you whether the system will recover in time for the business process. Compare backlog, the age of the oldest message, and arrival and processing rates for equivalent task types and load windows.&lt;/p&gt;

&lt;p&gt;The more useful question is whether the queue returns to its baseline after a comparable peak. If the oldest message keeps aging and processing falls behind arrivals, capacity and demand are out of balance. A nightly catalogue import and an order-processing queue need different tolerances, so message count alone is not a decision rule.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://qtim.pro/projects/hotz?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=seller-cabinet-sync&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;HOTZ Global project&lt;/a&gt;, BullMQ runs catalogue imports, 1C synchronisation, image processing, and product-feed rebuilds outside user requests. That illustrates how background work can be isolated; it does not claim that the project had a backlog incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short test:&lt;/strong&gt; compare recovery after equivalent peaks. Then test separate workers, concurrency limits, priorities, and backpressure against the acceptable business delay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Another instance barely moves throughput
&lt;/h2&gt;

&lt;p&gt;Adding application instances helps only while work can move between them and the shared dependencies still have headroom. A stateless component can handle the next request on any instance. Session affinity, local state, a database lock, a connection pool, or an external API can all remain the common limit.&lt;/p&gt;

&lt;p&gt;That is why scale-out should be tested as a curve, not accepted as a promise. &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/guide/design-principles/scale-out" rel="noopener noreferrer"&gt;Microsoft’s scale-out guidance&lt;/a&gt; makes the same point: additional instances do not guarantee proportional capacity.&lt;/p&gt;

&lt;p&gt;Short test: use the same request profile at several fixed instance counts. Compare total and per-instance throughput, database connections, lock waits, and read/write behaviour. A flat curve tells you where to look next; it does not name the cause on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  One dependency sets the pace of the whole checkout
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhtltj49tk4od9b8ioz51.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhtltj49tk4od9b8ioz51.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An external dependency belongs on the critical path when the next business step waits for its response. In the HOTZ Global checkout, delivery is calculated through CDEK, inventory is reserved in 1C, and payment is authorized through YooKassa. The system keeps a journal of reservation and payment states.&lt;/p&gt;

&lt;p&gt;This route shows how one user action spans several systems. It does not mean that any of those services was slow or failed in that project. Distributed tracing is what separates the path into operations and shows the time spent at each boundary.&lt;/p&gt;

&lt;p&gt;Test time-outs, retries, and unfinished operations together. A retry can be safe only when it does not create a second business effect. Idempotency supports that safety. A circuit breaker limits repeated calls to an unstable dependency; it does not remove the cause of the instability. A queue can move the continuation of an operation out of the user request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short test:&lt;/strong&gt; inject controlled latency or failure in a test environment. Verify that the user-facing request completes predictably, no second order or payment appears, and the unfinished operation is visible to the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  One fix now has four release paths
&lt;/h2&gt;

&lt;p&gt;The fifth signal does not appear on an infrastructure dashboard. It appears in change history: one product fix touches several modules or repositories, repeats the same checks, and waits for several releases.&lt;/p&gt;

&lt;p&gt;For the B2B catalogues of Teplomash, Sonniger, Volcano, and WDB, Qtim used an architecture reused across four independent environments. Each has its own frontend, backend, database, admin area, and release; the code is split across eight repositories. That separation enables independent releases and isolates one brand’s failure from the others. The trade-off is clear when a common change must be applied and verified in every environment.&lt;/p&gt;

&lt;p&gt;This is not an argument to merge every system. Independent boundaries can be the right choice when brands release at different rhythms or need separate failure isolation. The useful test is whether the component boundary matches a real responsibility and a real rhythm of change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short test:&lt;/strong&gt; trace one recent cross-cutting change from decision to production. Count touched modules and repositories, test cycles, release gates, and waiting time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rewrite only after the constraint survives a short test
&lt;/h2&gt;

&lt;p&gt;The diagnostic matrix below links each symptom to a measurement and an experiment. It does not prescribe an architecture.&lt;/p&gt;

&lt;p&gt;The first solution may be local: a database index, separate queue workers, a concurrency limit, a cache, or isolation of one integration. A larger architectural change becomes justified when the measured constraint sits in the system boundary itself and a local fix preserves the same ceiling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7mr1rx0i2bnybskwa4gr.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7mr1rx0i2bnybskwa4gr.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change the system boundaries only when a measured constraint sits in those boundaries and a local fix preserves the same ceiling.&lt;/p&gt;

&lt;p&gt;If you have one critical user journey, its current metrics, and a near-term growth scenario, &lt;a href="https://qtim.pro/services/product-support?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=web-app-scaling&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;our product support and development team can help turn them into a diagnostic and experiment plan.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>performance</category>
      <category>scalability</category>
    </item>
    <item>
      <title>Duolingo’s DAU Grew 23%. Here’s What E-Commerce Can Learn From Its Retention Loops</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Tue, 13 Oct 2026 09:52:40 +0000</pubDate>
      <link>https://dev.to/qtim/duolingos-dau-grew-23-heres-what-e-commerce-can-learn-from-its-retention-loops-on3</link>
      <guid>https://dev.to/qtim/duolingos-dau-grew-23-heres-what-e-commerce-can-learn-from-its-retention-loops-on3</guid>
      <description>&lt;p&gt;A useful return loop remembers intent, waits for a real trigger, and takes the customer back to the next step&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcmu5i3pd5mgbla8cqw8z.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcmu5i3pd5mgbla8cqw8z.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A shopper finds the right sneakers, selects size 43, and leaves to think. The next day, the store sends a discount notification. He taps it and lands on the homepage. Now he has to remember the model, find the product again, and select the size again.&lt;/p&gt;

&lt;p&gt;The store knew enough to send a message. It forgot everything that would have made the message useful.&lt;/p&gt;

&lt;p&gt;Duolingo handles the return differently. A reminder takes the learner back to the next lesson, with the streak and progress intact. The useful idea for e-commerce sits underneath the owl, the badges, and the cheerful pressure: preserve the customer’s context, wait for a relevant reason to return, and reduce the next action to one clear step.&lt;/p&gt;

&lt;h2&gt;
  
  
  The owl didn’t create 23% growth on its own
&lt;/h2&gt;

&lt;p&gt;Duolingo reported &lt;a href="https://www.sec.gov/Archives/edgar/data/1562088/000162828026053299/q2fy26duolingo6-30x26share.htm" rel="noopener noreferrer"&gt;58.7 million average daily active users in Q2 2026&lt;/a&gt;, up from 47.7 million a year earlier. That’s 23% year-on-year growth. The company attributed the acceleration to three factors: product changes, marketing, and a one-time &lt;a href="https://www.sec.gov/Archives/edgar/data/1562088/000162828026053299/q2fy26duolingo6-30x26share.htm" rel="noopener noreferrer"&gt;Streak Revival campaign&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The attribution matters. A retailer can’t copy one reminder and expect the same result. The repeatable part is the operating system behind it: a reason to return, stored progress, a low-friction next step, and experiments that separate product effect from seasonality.&lt;/p&gt;

&lt;p&gt;Duolingo’s leading retention metric makes that logic explicit. &lt;a href="https://www.sec.gov/Archives/edgar/data/1562088/000162828026053299/q2fy26duolingo6-30x26share.htm" rel="noopener noreferrer"&gt;Current User Retention Rate&lt;/a&gt;, or CURR, measures the share of current daily users who return the next day. A “current” user has also been active at least once during the previous seven days. In Q2 2026, CURR reached a record 84%.&lt;/p&gt;

&lt;p&gt;For a store, the equivalent metric depends on the buying cycle. Grocery and pet food may run on days or weeks. Furniture may run on years. A single daily-activity target would flatten those very different rhythms into one number.&lt;/p&gt;

&lt;h2&gt;
  
  
  One lesson beat the full daily plan
&lt;/h2&gt;

&lt;p&gt;Duolingo once required learners to complete their full daily goal to extend a streak. The team later separated the two mechanics and let a single lesson keep the streak alive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.duolingo.com/improving-the-streak/" rel="noopener noreferrer"&gt;The experiment produced three relative changes&lt;/a&gt;: Day 14 retention rose 3.3%, overall daily active users rose 1%, and the share of daily users with a streak rose 10.5% during the first 20 days. Daily-goal completion fell. That trade-off is the useful part of the story. A lower threshold improved the return habit even though a nearby engagement metric moved in the wrong direction.&lt;/p&gt;

&lt;p&gt;An e-commerce return loop needs the same discipline. The smallest useful action might be checking whether size 43 is back, reopening a saved comparison, repeating the last order, or seeing the current delivery status. Sending someone through the whole catalogue again raises the threshold at exactly the wrong moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A sofa has no use for a daily streak
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhxqzuy6hydn7ggd8gcb0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhxqzuy6hydn7ggd8gcb0.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Languages can be practiced every day. Sofas are bought less often. The right return frequency comes from the category and the customer’s unfinished job.&lt;/p&gt;

&lt;p&gt;Consumables create predictable windows for replenishment. Fashion and electronics often create a shorter consideration period: people revisit a product, wait for a price change, compare specifications, or watch for a size to return. After purchase, delivery, installation, supplies, warranty, and repair create a different set of reasons to come back.&lt;/p&gt;

&lt;p&gt;This is why “hasn’t visited recently” is weak targeting. It knows a date. A useful trigger knows what changed for the customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Return the value the customer already created
&lt;/h2&gt;

&lt;p&gt;Duolingo’s Streak Revival campaign restored a learner’s longest streak after opt-in and three completed lessons. In June 2026, 15.4 million learners revived a streak; nearly 8 million had no active streak when the campaign began.&lt;/p&gt;

&lt;p&gt;The campaign worked with value that users had already earned. Retail products hold similar customer-created value: a saved list, a configured product, a basket, a comparison history, loyalty status, or a watched price.&lt;/p&gt;

&lt;p&gt;A five-item basket is already a detailed brief. Replacing it with a generic bestseller page forces the customer to repeat work the product has already observed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A notification should resume the task
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feidbg1d6hjczr4ol2ssi.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feidbg1d6hjczr4ol2ssi.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The notification is only the door. The destination determines whether the customer continues or starts over.&lt;/p&gt;

&lt;p&gt;A useful deep link opens the exact product, size, color, saved filter set, comparison, or basket state. To make that possible, the product must connect customer identity with scenario state: product ID, SKU, selected variant, price at the time of interest, availability, and notification consent.&lt;/p&gt;

&lt;p&gt;Events such as product_viewed, favorite_added, cart_updated, and order_completed show where the customer stopped. A new signal, such as stock returning or a watched price changing, can then trigger the message. The push notification sits at the end of that chain, not at the beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five layers sit between a product page and a useful push
&lt;/h2&gt;

&lt;p&gt;Take the sneaker example. The return loop needs five layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Events: the shopper viewed a specific model and selected size 43.&lt;/li&gt;
&lt;li&gt;Profile: the system connects the shopper with the model, color, size, permitted channel, and consent.&lt;/li&gt;
&lt;li&gt;Decision: size 43 returns to stock, creating a concrete reason to send a message.&lt;/li&gt;
&lt;li&gt;Delivery: the message opens that model with size 43 already selected, while frequency rules prevent notification fatigue.&lt;/li&gt;
&lt;li&gt;Experiment: only part of the eligible audience sees the new flow; the control group keeps the previous experience.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The control group should exist before launch. Orders may rise because of a notification, a promotion, payday, weather, or season. Showing the flow to everyone removes the reference point and leaves the team with a result it can celebrate but can’t explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with an abandoned task, not an inactive user
&lt;/h2&gt;

&lt;p&gt;The first candidate should combine visible intent with a new, useful signal: a size is available again, a watched price has changed, or a replenishment window has arrived.&lt;/p&gt;

&lt;p&gt;Next, define the smallest action that resumes the task. For apparel, that may be a deep link to one SKU and size. For recurring goods, it may be a prefilled repeat order. For complex products, it may be the saved comparison rather than the catalogue.&lt;/p&gt;

&lt;p&gt;Then write one hypothesis and one business outcome before building the flow. For example: a back-in-stock message for the selected size will increase completed orders among shoppers who previously viewed that SKU. That statement is narrow enough to test and broad enough to matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  More DAU can still mean a worse product
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faunnpfbdir7qczj0wep1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faunnpfbdir7qczj0wep1.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Duolingo once tested an offline promotion for its paid plan. The experiment increased subscription purchases and produced a slight revenue lift. It also reduced retention and daily active users, so the team shut it down.&lt;/p&gt;

&lt;p&gt;Retail teams face the same trap. A push can increase visits. A discount can increase orders. Together they can also erode margin and exhaust the audience.&lt;/p&gt;

&lt;p&gt;Open rate is therefore a delivery metric, not a business verdict. The measurement chain should cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the customer returned to the intended scenario;&lt;/li&gt;
&lt;li&gt;whether the customer completed the target action or order;&lt;/li&gt;
&lt;li&gt;what happened to revenue and margin;&lt;/li&gt;
&lt;li&gt;whether unsubscribes, notification opt-outs, returns, or support requests increased.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DAU won’t fit every store either. A closer analogue to CURR may be the share of customers who return to a saved product, basket, or repeat order within the category’s normal time window. For infrequent purchases, saved-list conversion and post-purchase support may tell the team more than daily visits ever will.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule: match the loop to the buying rhythm
&lt;/h2&gt;

&lt;p&gt;Duolingo’s loop is simple: remember where the learner stopped, wait for a relevant reason to return, take the learner to the next action, and test the effect against a control group.&lt;/p&gt;

&lt;p&gt;E-commerce can use the same order of operations. The frequency changes by category. Pet food may create a weekly or monthly signal. Electronics may create a signal when the price moves. Apparel may create one when the right size returns.&lt;/p&gt;

&lt;p&gt;The product should continue the customer’s existing task. A generic campaign can wait.&lt;/p&gt;

&lt;p&gt;Q&lt;a href="https://qtim.pro/services/e-commerce?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=duolingo-retention-loops&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;tim designs and develops e-commerce products&lt;/a&gt; around customer journeys, integrations, and measurable business outcomes. Start with one interrupted scenario, connect its events to stored context, and test whether the new route improves completed orders without damaging margin or customer tolerance.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>product</category>
      <category>ux</category>
    </item>
    <item>
      <title>How to Test Backups Against Real Recovery Targets</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:01:14 +0000</pubDate>
      <link>https://dev.to/qtim/how-to-test-backups-against-real-recovery-targets-18j2</link>
      <guid>https://dev.to/qtim/how-to-test-backups-against-real-recovery-targets-18j2</guid>
      <description>&lt;p&gt;A database restore is only one checkpoint. The real target is a working user flow, verified data, and a measured return to service.&lt;/p&gt;

&lt;p&gt;Press enter or click to view image in full size&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bxi5i1drsol0nojf0ey.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bxi5i1drsol0nojf0ey.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The database is online again. The lesson still will not open. A user can sign in, but their scheduled consultation is missing. A paid account has returned without the access rights attached to it.&lt;/p&gt;

&lt;p&gt;This is why a successful backup job tells us less than it appears to. It confirms that a system wrote a copy somewhere. It does not prove that the copy is readable, that every required dependency can be restored, or that the product will return within the time the business expects.&lt;/p&gt;

&lt;p&gt;I am Anton Fokin, CEO of Qtim. When we discuss recovery, we start with the user action that must work after an incident. Then we work backwards through the application, data, infrastructure, and access controls required to restore it.&lt;/p&gt;

&lt;h2&gt;
  
  
  RPO and RTO begin with user actions
&lt;/h2&gt;

&lt;p&gt;Two metrics turn a backup policy into a business decision.&lt;/p&gt;

&lt;p&gt;Recovery Point Objective, or RPO, defines how much recent data the company can afford to lose. Recovery Time Objective, or RTO, defines how long a critical function may remain unavailable. AWS Well-Architected recommends validating both through recovery testing: check the age of the restored data for RPO and measure the full route back to an operational workload for RTO.&lt;/p&gt;

&lt;p&gt;Press enter or click to view image in full size&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7z3dzeb92xpfhhdv4m6r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7z3dzeb92xpfhhdv4m6r.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same target should not cover every dataset. A catalog may be rebuilt from another source. A search index can often be generated again. Course progress, payment records, access rights, and scheduled sessions need stricter treatment because reconstructing them may be slow, incomplete, or impossible.&lt;/p&gt;

&lt;p&gt;We define recovery targets by process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Name the critical user action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decide how much recent data that action can lose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the maximum time for the action to work again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose a backup and recovery design that can meet both limits.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The storage technology comes after those decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The database is back. The product is not.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6llaz2nrjloze1sq4oe.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6llaz2nrjloze1sq4oe.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A live database does not make a product usable. The service may also depend on the application version, infrastructure configuration, object storage, queues, a search index, encryption keys, DNS, background jobs, and external integrations.&lt;/p&gt;

&lt;p&gt;Some components can be rebuilt. Others need their own recovery point. The order matters too. We usually restore infrastructure and key access first, then data stores, the application, background processing, and integrations. The last step is an end-to-end path through the product.&lt;/p&gt;

&lt;p&gt;The slowest required dependency sets the real recovery time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Qtim cases show why the target is a workflow
&lt;/h2&gt;

&lt;p&gt;In Studycats, we brought six educational courses into one platform with user accounts, homework, practice tests, and progress statistics. For a product with this contour, a recovery target has to answer concrete questions. How much submitted work, test history, purchase data, or course-access data could the business accept losing? When does the learner regain the ability to sign in, open the right course, submit work, and see the correct result?&lt;/p&gt;

&lt;p&gt;The published case describes the product we built, not the client’s internal backup policy. We use the workflow to define what a recovery test must prove.&lt;/p&gt;

&lt;p&gt;Ponimayu is a corporate employee-support platform with online consultations from different specialists. Restoring its database would still leave the central question unanswered. Can a user enter through corporate access, see the scheduled session, and join the consultation with the right permissions and data?&lt;/p&gt;

&lt;p&gt;These cases have different interfaces, but the recovery logic is the same. A product returns when its critical chain works from the user’s first action to the business record created or retrieved at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-step recovery drill
&lt;/h2&gt;

&lt;p&gt;We treat a backup as usable only after a restore in an isolated environment. AWS calls out a common failure mode: teams restore a resource but never read or validate the data inside it.&lt;/p&gt;

&lt;p&gt;Our minimum drill follows seven steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Choose one service and record its target RPO and RTO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select a recovery point through the same procedure used in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the clock and build an isolated environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check integrity through checksums, record counts, and business invariants.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect the application and complete one critical workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the actual data loss and the full time to readiness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the runbook, automation, and ownership after the test.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A business invariant connects records that must remain consistent. In an education platform, payment, course access, submitted work, and test results may need to agree. In a consultation service, corporate access must lead to the correct scheduled session. A successful SELECT query cannot prove either condition.&lt;/p&gt;

&lt;p&gt;The runbook should also be tested by someone who did not write it. During an incident, the author may be unavailable. Commands, expected results, and stop conditions need to make sense without a live explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A copy in the same failure domain shares the same risk
&lt;/h2&gt;

&lt;p&gt;PrThe test record expires as the system changes&lt;br&gt;
After each drill, we keep a short record: the service, owner, recovery point, source copy, target and actual RPO/RTO, integrity checks, end-to-end result, constraints found, runbook changes, and next test date.&lt;/p&gt;

&lt;p&gt;The date matters because recovery results age quickly. Database growth, a new application version, another region, key rotation, storage migration, or a redesigned payment or authentication flow can invalidate the previous measurement. AWS Prescriptive Guidance recommends aligning disaster-recovery testing with business requirements and repeating it after material application or infrastructure changes.&lt;/p&gt;

&lt;p&gt;A six-month-old RTO measurement may describe an architecture that no longer exists.oduction data and backups should not depend on one administrator account, one deletion policy, one writable network location, or one region. CISA recommends keeping critical backups offline and encrypted, then testing their availability and integrity regularly. The agency also warns that ransomware operators look for accessible backups and try to delete or encrypt them alongside production data.&lt;/p&gt;

&lt;p&gt;In cloud infrastructure, isolation can include a separate account, immutable storage, different permissions for creating and deleting copies, multi-factor approval for sensitive operations, and independent alerts. The right combination depends on the threat model and the cost of downtime.&lt;/p&gt;

&lt;p&gt;Replication solves another problem. It can support a fast failover after a node failure. It can also reproduce an accidental deletion or corruption. Returning to a point before the event still requires an independent recovery copy with the right retention period.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test record expires as the system changes
&lt;/h2&gt;

&lt;p&gt;After each drill, we keep a short record: the service, owner, recovery point, source copy, target and actual RPO/RTO, integrity checks, end-to-end result, constraints found, runbook changes, and next test date.&lt;/p&gt;

&lt;p&gt;The date matters because recovery results age quickly. Database growth, a new application version, another region, key rotation, storage migration, or a redesigned payment or authentication flow can invalidate the previous measurement. AWS Prescriptive Guidance recommends aligning disaster-recovery testing with business requirements and repeating it after material application or infrastructure changes.&lt;/p&gt;

&lt;p&gt;A six-month-old RTO measurement may describe an architecture that no longer exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five questions before the next release
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvw4wnz6ry53tkjitwp22.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvw4wnz6ry53tkjitwp22.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which user actions can the business afford to lose, and for how long?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;How quickly must each critical function work again?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where are the recovery copies, and who can change or delete them?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When did the team last rebuild the service from a saved point?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What actual RPO and RTO did that test produce?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our decision rule is simple: a backup becomes credible after the team restores it, validates the data, completes an essential workflow, and records the actual RPO and RTO.&lt;/p&gt;

&lt;p&gt;At Qtim, backup and recovery sit inside the wider SaaS infrastructure scope alongside observability, service-level commitments, incident response, and operational runbooks. See how we approach &lt;a href="https://qtim.pro/services/saas?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=backup-recovery-testing&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;SaaS engineering and infrastructure&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>database</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>testing</category>
    </item>
    <item>
      <title>The CRM Says the Target Is Met. The Bank Account Says Otherwise</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Fri, 09 Oct 2026 12:42:55 +0000</pubDate>
      <link>https://dev.to/qtim/the-crm-says-the-target-is-met-the-bank-account-says-otherwise-36o</link>
      <guid>https://dev.to/qtim/the-crm-says-the-target-is-met-the-bank-account-says-otherwise-36o</guid>
      <description>&lt;p&gt;Why dashboards show several versions of the same business — and how to decide which number should drive a decision&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdpf2ejrlkkijhegpra4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdpf2ejrlkkijhegpra4.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
The sales meeting starts well. The CRM shows the target as complete and the deals are green. Then finance opens its report: some invoices are still unpaid, a few orders have been refunded, and the largest contract exists only on paper. The conversation moves from results to a harder question: which number is real?&lt;/p&gt;

&lt;p&gt;Both screens may be correct. They answer different questions while using almost the same label. The conflict usually starts before anyone builds a chart: the company has not agreed on which event counts as a sale, which system owns the date, or how later changes should affect a closed deal.&lt;/p&gt;

&lt;p&gt;A reliable dashboard begins with a decision and traces one metric back to the event behind it. Here is a practical way to do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  One “sale” hides four different events
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fylr64hcbjz1ne9mj7sal.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fylr64hcbjz1ne9mj7sal.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Sales, finance, operations, and the business owner each have a valid moment of truth. A salesperson may count a signed contract or a deal moved to “won.” Finance counts cash received. Operations looks at a shipment or a completed service. The owner may care about revenue after cancellations and refunds.&lt;/p&gt;

&lt;p&gt;These definitions serve different jobs. Pipeline stages show workload and the probability of closing. Payment data shows cash movement. Fulfilment data confirms that the company delivered what it promised. Trouble starts when all four events appear as “sales” on neighboring widgets.&lt;/p&gt;

&lt;p&gt;The dashboard can be technically flawless and still mislead. The CRM sums deals at the selected stage, the accounting system sums payments, and the delivery service counts shipped orders. A vague label makes different sources and time points look comparable.&lt;/p&gt;

&lt;p&gt;Before choosing colors or chart types, map the deal as a sequence of events. Then select the event that answers the decision-maker’s question.&lt;/p&gt;

&lt;h2&gt;
  
  
  A green stage can turn a forecast into a fact
&lt;/h2&gt;

&lt;p&gt;A salesperson moves a deal to “won” when the client accepts the offer, signs the contract, or meets another agreed condition. Commercial work may be finished at that point. The payment system may still have nothing to report: the money can arrive later, arrive in parts, or never arrive.&lt;/p&gt;

&lt;p&gt;When a dashboard treats the green stage as payment, the forecast quietly becomes a fact. A manager sees the plan as complete and increases spending on hiring, inventory, or advertising. The gap appears after the decision has already been made.&lt;/p&gt;

&lt;p&gt;Precise names protect the meaning. “Value of closed deals” comes from the CRM. “Payments received” comes from the payment or accounting system. “Net revenue” includes refunds, discounts, and partial payments. They can share one screen as long as the interface makes the distinction visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payment has arrived. The dashboard learns about it an hour later
&lt;/h2&gt;

&lt;p&gt;Business data runs on several clocks. The CRM changes after a salesperson acts. A payment service sends an event through an API. An accounting system posts documents on a schedule. An analytics layer rebuilds its dataset at a set interval.&lt;/p&gt;

&lt;p&gt;A label such as “updated today” is as useful as a clock without a minute hand. A payment from five minutes ago may appear in an hour. During a silent failure, yesterday’s value can remain on screen and look perfectly healthy.&lt;/p&gt;

&lt;p&gt;Every critical metric needs the time of its last successful update, an acceptable delay, and a warning when that limit is exceeded. Data at the start of the day may be enough for a morning meeting. Payment control or support load requires a different rhythm. The decision determines the refresh rate.&lt;/p&gt;

&lt;p&gt;The integration also has to reject duplicates and detect missing events. Stable event identifiers, retries, and an error log prevent one persistent service from “selling” the same order several times.&lt;/p&gt;

&lt;h2&gt;
  
  
  One field, three writers, and no clear owner
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkhdlgqxmrnxq630l5i3m.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkhdlgqxmrnxq630l5i3m.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A manager, an automation rule, an import, and an external system may all update the same field. A person marks the contract as approved, automation reacts to an issued invoice, and an integration receives the payment. The last writer wins, even when its version is less accurate. Reverse synchronization can also restore an old status after a person corrects it.&lt;/p&gt;

&lt;p&gt;Key fields need an owner. The team records which system creates the value, who may change it, and which event is final. The audit trail stores the old and new value, the time, and the actor. A disagreement can then be resolved by following the event chain.&lt;/p&gt;

&lt;p&gt;We used this logic in an attestation platform for Leo Tolstoy University. Its application model accounts for rescheduling, absences, and retakes. A super administrator can access video recordings, while an administrator works with documents and results without video access. About 460 candidates went through the platform. Roles and state transitions are encoded in the system, so each status has one meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Returns and filters can rewrite the same month
&lt;/h2&gt;

&lt;p&gt;A deal can include an advance payment, a final payment, and a partial refund. A model that sees only the first payment keeps the good news on screen longer than it remains in the cash position.&lt;/p&gt;

&lt;p&gt;The value of signed deals reflects agreements recorded in the CRM. Payments received show cash movement. Net cash result applies the agreed rules for refunds and cancellations. Each metric also has its own date: the deal, payment, and refund may land in different months.&lt;/p&gt;

&lt;p&gt;The company must choose how history is recalculated. A refund issued in July for a June sale can revise June or appear as a July adjustment. Either method can work. Mixing them destroys period-to-period comparisons.&lt;/p&gt;

&lt;p&gt;Access rules and filters create another split. A department head may see one team, a commercial director the whole business, and a partner only permitted deals. One person may filter by creation date while another uses closing date. A shared page title does not guarantee a shared dataset.&lt;/p&gt;

&lt;p&gt;Critical filters should sit next to the metric: period, business unit, currency, customer type, and the date field in use. Shared meetings need a saved reference view, plus a warning when permissions hide part of the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six labels turn a number into a decision tool
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qycgyytboes0yzobeyp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qycgyytboes0yzobeyp.webp" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take the metric that causes the most disagreement and complete this six-line card:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decision. What will the manager change when the metric rises or falls?&lt;/li&gt;
&lt;li&gt;Definition. Which event, formula, and period are included?&lt;/li&gt;
&lt;li&gt;Source. Which system wins when values disagree?&lt;/li&gt;
&lt;li&gt;Freshness. How often does the data update, and where is a delay visible?&lt;/li&gt;
&lt;li&gt;Owner. Who is responsible for the metric’s meaning and data quality?&lt;/li&gt;
&lt;li&gt;Action. Which deviation triggers a response, and who starts it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A blank line means the metric is not ready to drive a decision. Agree on its meaning, source, and response first. Design the chart, filters, alerts, and drill-down afterward.&lt;/p&gt;

&lt;p&gt;Then trace several deals back to the source system. This exposes the point where the stories diverge: a status replaced a payment, an update arrived late, a refund fell into another period, or a role hid some records. The remedy may be a process change, a configuration update, an integration fix, or custom logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure the CRM or build custom logic?
&lt;/h2&gt;

&lt;p&gt;An off-the-shelf CRM works when the pipeline is close to a standard model, roles fit its permissions, and integrations provide enough detail. Reworking stages, required fields, access rights, automation, and a few reports may solve the problem. Custom development would add cost and responsibility without a clear benefit.&lt;/p&gt;

&lt;p&gt;Custom logic becomes relevant when the CRM controls the core operating process. Typical signs include connections between a website, customer account, ERP, warehouse, and data platform; several contract and payment models; complex permissions; company-specific metric rules; change history; or high load.&lt;/p&gt;

&lt;p&gt;A custom system also makes the company responsible for architecture, integrations, monitoring, support, and further development. Start with a map of processes, roles, data, and key screens. It reveals where configuration is enough, which steps should remain in external services, and what has to be built.&lt;/p&gt;

&lt;p&gt;The decision rule is simple: define the business event first, assign one source of truth, and only then turn it into a dashboard metric.&lt;/p&gt;

&lt;p&gt;If your CRM shows several versions of the same business, we can help map the data flow and define the right scope for &lt;a href="https://qtim.pro/services/crm?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=crm-multiple-versions-business&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;CRM and management dashboards.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>saas</category>
    </item>
    <item>
      <title>The Price Updated. Inventory Didn’t: Why Seller Portals Lose the Truth Between Systems</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Wed, 07 Oct 2026 13:30:56 +0000</pubDate>
      <link>https://dev.to/qtim/the-price-updated-inventory-didnt-why-seller-portals-lose-the-truth-between-systems-46je</link>
      <guid>https://dev.to/qtim/the-price-updated-inventory-didnt-why-seller-portals-lose-the-truth-between-systems-46je</guid>
      <description>&lt;p&gt;A seller portal becomes useful when it shows what each platform has actually done, where an operation stopped, and what the team can do next&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwfwsdeszkp12251m35fd.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwfwsdeszkp12251m35fd.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A manager updates a price and sees a green checkmark. Inventory is still old. On the marketplace, the item has already joined a promotion. At that point, one question matters: was the change sent, accepted, or actually applied?&lt;/p&gt;

&lt;p&gt;A simple interface can hide that gap behind the word “success.” The team discovers it later, when an order has to be cancelled, a discount eats into margin, or accounting cannot find the right report.&lt;/p&gt;

&lt;p&gt;I’m Anton Fokin, CEO of Qtim. Here is how we break a unified seller portal into operational states, why a working API connection is only the beginning, and which end-to-end flow belongs in the first release.&lt;/p&gt;

&lt;h2&gt;
  
  
  A green checkmark hides an asynchronous workflow
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1yg2rk257k8bh2stt425.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1yg2rk257k8bh2stt425.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The “Update price” button starts a chain. The portal creates a request, sends it to the marketplace, receives a technical response, and waits for the processing result. The operation can stop at any step.&lt;/p&gt;

&lt;p&gt;A price change therefore needs at least four visible states:&lt;/p&gt;

&lt;p&gt;• created in the portal;&lt;/p&gt;

&lt;p&gt;• sent to the marketplace;&lt;/p&gt;

&lt;p&gt;• accepted for processing;&lt;/p&gt;

&lt;p&gt;• applied, or rejected with a reason.&lt;/p&gt;

&lt;p&gt;&lt;a href="//developer-docs.amazon.com/sp-api/docs/submit-a-feed"&gt;Amazon’s current Feeds API&lt;/a&gt; makes the gap explicit. After createFeed returns a feed ID, the client still has to check getFeed until processing reaches DONE, CANCELLED, or FATAL. A FATAL result can mean that some, none, or all operations completed, and the processing report shows which records succeeded or failed.&lt;/p&gt;

&lt;p&gt;The same guide records a recent platform change: since July 31, 2025, Amazon no longer supports legacy XML and flat-file listing feeds for listings, pricing, inventory, relationships, and images. A connector can keep accepting clicks in the portal after the platform has changed its rules, so connector version and feed format belong in monitoring too.&lt;/p&gt;

&lt;p&gt;Inventory, orders, and documents need the same discipline. For each operation, the portal stores its own ID, the marketplace operation ID, the original payload, the current state, and the error message. A manager can see where the process stopped. A developer can reconstruct it from the event log.&lt;/p&gt;

&lt;p&gt;The next decision is the source of truth. A price may come from an ERP or a separate pricing service. Physical inventory may live in an ERP or a warehouse management system, while available-to-sell inventory depends on reservations and marketplace rules. Before development starts, we assign an owner to every field. That keeps systems from overwriting one another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price and inventory do not share a clock
&lt;/h2&gt;

&lt;p&gt;Price and inventory sit next to each other on screen, which makes them look like one dataset. The integration sees separate updates with their own queues, validation rules, and completion times. This is how the price can change while the stock count remains old.&lt;/p&gt;

&lt;p&gt;Amazon warns that feed processing can take up to eight hours under high load. Product data feeds are processed sequentially, and several small submissions can sit behind earlier feeds. The right interface therefore shows a queued operation as queued; it does not upgrade an accepted request into an applied change.&lt;/p&gt;

&lt;p&gt;We use a managed queue. A temporary failure waits before the next attempt, with the interval increasing after repeated errors. A permanent failure, such as an invalid value, moves to an exception queue with a clear reason. Retries keep the same idempotency key, so a restored connection does not create a duplicate operation.&lt;/p&gt;

&lt;p&gt;Users need four timestamps: when the source value changed, when the portal sent it, when the marketplace accepted it, and when the result was confirmed. “Updated at 12:40” is useless without the event behind it.&lt;/p&gt;

&lt;p&gt;The main view can stay simple: the current source value, the confirmed marketplace value, the last reconciliation time, and the next action after an error. A discrepancy then becomes a task instead of a surprise in a report.&lt;/p&gt;

&lt;h2&gt;
  
  
  One order crosses several status dictionaries
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0lf1gdwmq7ebx6ndcj0f.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0lf1gdwmq7ebx6ndcj0f.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Orders are harder because both sides of the integration change state. The marketplace creates the order and advances it through its own workflow. The ERP reserves inventory. The warehouse confirms picking. Delivery adds another set of events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shopify.dev/docs/apps/build/webhooks" rel="noopener noreferrer"&gt;Shopify’s current webhook guidance&lt;/a&gt; shows why a push event is only one part of synchronization. Delivery order is not guaranteed, even within one topic. The same webhook can arrive more than once after a timeout or retry, and an application can miss an event during downtime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shopify.dev/docs/apps/build/webhooks/verify-deliveries" rel="noopener noreferrer"&gt;Shopify recommends&lt;/a&gt; using delivery IDs to skip duplicates, timestamps to restore event order, and reconciliation jobs to fetch changes periodically. A seller portal needs the same safeguards: accept each event once, preserve the platform’s original code, map it to an internal business state, and reconcile against the source.&lt;/p&gt;

&lt;p&gt;Flattening every marketplace into five universal labels creates blind spots. “Ready to ship” may require different actions and documents on two platforms. The interface can show a clear business state while the data model preserves the external code and the full transition history. Support can then explain why an order is stuck without assembling the story from screenshots.&lt;/p&gt;

&lt;p&gt;Inventory also needs more than one number. Operations teams usually work with physical stock, reserved stock, available-to-sell stock, and the value confirmed by each marketplace. The available-stock formula should live in one place. Copying it into the ERP, the portal, and an integration script guarantees drift.&lt;/p&gt;

&lt;p&gt;Idempotency protects the workflow at this point. A repeated event must not deduct stock again, create a second document, or launch another shipment. It is invisible when it works and expensive when it fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Generated” and “received” are separate document states
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwuml6xrc7budqm6avhv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwuml6xrc7budqm6avhv.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documents rarely make the first prototype because the team is focused on catalogue and orders. Later, managers still download reports from each marketplace, rename files, and reconcile periods across systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer-docs.amazon/sp-api/docs/reports-api" rel="noopener noreferrer"&gt;Amazon’s Reports API&lt;/a&gt; covers inventory, orders, tax, returns, and other operational data. Its current workflow separates requesting or scheduling a report, verifying that processing has finished, and retrieving the document. A “Download” button in the seller portal should expose that sequence: requested, generating, ready, or failed.&lt;/p&gt;

&lt;p&gt;The file is only part of the record. The portal also needs the document type, marketplace, legal entity, reporting period, version, generation date, and links to orders or payouts. When a platform regenerates a report, the system must preserve which version went to accounting.&lt;/p&gt;

&lt;p&gt;A useful document view answers three questions without a chat message: which period the report covers, whether it is ready, and who has already exported it.&lt;/p&gt;

&lt;p&gt;The most useful dashboard is an exception queue&lt;br&gt;
Early portal mockups often lead with revenue charts, order counts, and inventory by warehouse. Executives may need those numbers. Operations teams open the system to find out what requires intervention today.&lt;/p&gt;

&lt;p&gt;We put these items on the first screen:&lt;/p&gt;

&lt;p&gt;• prices rejected by a marketplace;&lt;/p&gt;

&lt;p&gt;• products whose stock values disagree;&lt;/p&gt;

&lt;p&gt;• orders stuck between states;&lt;/p&gt;

&lt;p&gt;• documents that missed their expected generation time.&lt;/p&gt;

&lt;p&gt;Each row opens the operation history: who changed the data, what the portal sent, what came back, how many attempts ran, and what can happen next. A recoverable error gets a retry action. A source-data error links to the field that needs correction. An unavailable API shows the time of the next attempt.&lt;/p&gt;

&lt;p&gt;An audit trail matters more here than an attractive activity feed. It connects a person’s action, a data version, and the external response. Without that chain, “who changed the price?” becomes a search across chats and logs.&lt;/p&gt;

&lt;p&gt;Permissions should follow operations too. A category manager edits prices, a warehouse employee handles shipments, an accountant exports documents, and a manager sees the overview. Permission to view an operation does not automatically include permission to retry or cancel it.&lt;/p&gt;

&lt;p&gt;The first release should complete one operation end to end&lt;br&gt;
Trying to combine catalogue, analytics, advertising, finance, and documents in the first release delays the test that matters. Pick one business operation and carry it through the entire system.&lt;/p&gt;

&lt;p&gt;For example, a manager changes a price in the source system. The portal sends it to two marketplaces, receives final states, surfaces discrepancies, and safely retries a failed operation. That one flow tests the data model, queue, permissions, audit trail, and error handling. The next flow can reuse the foundation.&lt;/p&gt;

&lt;p&gt;We built related coordination mechanisms in the &lt;a href="https://qtim.pro/projects/hotz?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=seller-cabinet-sync&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;HOTZ project&lt;/a&gt;: one catalogue with two-way 1C exchange for products, inventory, and orders. In the &lt;a href="https://qtim.pro/projects/teplomash?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=seller-cabinet-sync&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;Teplomash project&lt;/a&gt;, a shared platform synchronized catalogues, prices, inventory, and order processing for three brands. These are different types of systems, but they rely on the same architectural principle: one layer coordinates data across several systems and keeps exchange rules in one place.&lt;/p&gt;

&lt;p&gt;Custom development is unnecessary for every seller. A single marketplace, a small catalogue, and straightforward operations often fit the platform’s native tools or an off-the-shelf connector. A dedicated layer starts to make sense when one operation crosses marketplaces, an ERP, a warehouse, and document workflows, and reconciliation failures already cost cancellations, staff time, or margin.&lt;/p&gt;

&lt;p&gt;Decision rule: when an employee completes one business operation across several systems, a unified portal has something valuable to unify.&lt;/p&gt;

&lt;p&gt;Start with a map of data owners and one end-to-end flow. Our guide to &lt;a href="https://qtim.pro/services/cabinets?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=seller-cabinet-sync&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;custom account and ecosystem development&lt;/a&gt; outlines the integrations and operational mechanisms that usually belong in this kind of system.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>api</category>
      <category>development</category>
    </item>
    <item>
      <title>ChatGPT’s New EU Status Exposes an AI Architecture Problem</title>
      <dc:creator>Qtim</dc:creator>
      <pubDate>Mon, 05 Oct 2026 08:34:22 +0000</pubDate>
      <link>https://dev.to/qtim/chatgpts-new-eu-status-exposes-an-ai-architecture-problem-o0b</link>
      <guid>https://dev.to/qtim/chatgpts-new-eu-status-exposes-an-ai-architecture-problem-o0b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmih5sg1d5pze83hu9ncl.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmih5sg1d5pze83hu9ncl.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A product team ships a “search the web” toggle behind a chatbot. The interface barely changes. The system now decides when to browse, rewrites the user’s question, selects sources, and compresses them into one answer. That small toggle creates a much harder audit problem.&lt;/p&gt;

&lt;p&gt;On Aug 31, 2026, the European Commission designated ChatGPT a Very Large Online Search Engine under the Digital Services Act. The Commission called it a hybrid service because it answers prompts and can search the web. The classification followed what the product does beneath the interface.&lt;/p&gt;

&lt;p&gt;I’m Anton Fokin, CEO of Qtim. We build AI chatbots, RAG systems, and language-model integrations. The useful lesson for product teams is architectural: once a system selects information for users, the final answer stops being enough evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  ChatGPT crossed the 45-million-user threshold
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxucp4ned7j7hlq9n61po.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxucp4ned7j7hlq9n61po.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChatGPT reported 159.1 million average monthly users in the EU in the official list, well above the 45 million threshold for a VLOSE. After notification, the service has four months to comply with the additional obligations for the largest search engines. Those include systemic-risk assessment and mitigation, annual independent audits, and data access under defined procedures.&lt;/p&gt;

&lt;p&gt;A 2026 Microsoft Research preprint gives the product question more weight. The authors examined 234,839 public ChatGPT conversations collected from 2023 through 2025. They classified 79% of user inputs as difficult to answer through conventional web search. For comparable searchable questions, ChatGPT responses covered less diverse information than Google results across most topics. The dataset is observational and does not represent every user. It still shows that a system can accept a broad question and return a narrower range of information.&lt;/p&gt;

&lt;p&gt;The designation imposes obligations on the named services. It does not automatically place every AI product under the DSA. The regulation covers intermediary services offered to recipients in the EU, regardless of the provider’s location. Outside the DSA, public AI products still need traceability when they choose sources for users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five checks we use before release
&lt;/h2&gt;

&lt;p&gt;Before an AI feature ships, we ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which information space can the system reach: user input, company documents, partner data, or the open web?&lt;/li&gt;
&lt;li&gt;Where does the product select sources and narrow the user’s view?&lt;/li&gt;
&lt;li&gt;Can the team reconstruct the path from request to answer across model, instruction, retrieval, and policy versions?&lt;/li&gt;
&lt;li&gt;Which users and harms could the feature affect, and what signal would reveal a problem?&lt;/li&gt;
&lt;li&gt;Who can inspect the decision a month later, and which evidence will still exist?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answers define the product boundary more accurately than the word “chatbot.” A closed knowledge base may only need document identifiers and versioning. An open-web product needs a decision log, an evaluation pipeline, and a tested way to stop the feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  You cannot audit a screenshot
&lt;/h2&gt;

&lt;p&gt;A generative-search answer is the end of at least four decisions: whether to search, which queries to send, which documents and passages to use, and which policies or filters to apply. Two identical answers can come from different sources. Two different answers can come from the same model version after web results or an index changes.&lt;/p&gt;

&lt;p&gt;We use a common request identifier to join the evidence chain. It should connect the model and instruction versions, tool calls, generated queries, source or chunk identifiers, policy decisions, the final answer, citations, retries, human intervention, and rollback events.&lt;/p&gt;

&lt;p&gt;The tempting shortcut is to keep every prompt, retrieved page, and response forever. That improves reproduction and creates a much larger privacy and security problem. Retention, masking, deletion, and access controls belong in the traceability design. A useful record reconstructs a decision without cloning the conversation database.&lt;/p&gt;

&lt;p&gt;Testing also moves one layer down. A fixed “golden answer” breaks as wording changes. More stable checks ask whether the right sources were eligible, the expected tool ran, a policy fired, or a high-risk condition stopped the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put risk review in the release path
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxpcrm4ps7ak5uv1n4p2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxpcrm4ps7ak5uv1n4p2.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Article 34 of the DSA requires systemic-risk assessments at least annually and before features likely to have a critical impact on identified risks. Product teams can translate that into a release gate.&lt;/p&gt;

&lt;p&gt;Four objects need to stay connected:&lt;/p&gt;

&lt;p&gt;the user scenario and the groups it affects;&lt;br&gt;
the risk and the observable signal that would reveal it;&lt;br&gt;
the mitigation, such as a limit, review step, interface change, or policy;&lt;br&gt;
the rollout plan, including monitoring, stop conditions, and rollback.&lt;br&gt;
The DSA does not prescribe a database schema or observability stack. This mapping is our engineering interpretation. Without it, the risk assessment sits in a document, the launch decision in a tracker, and runtime events across several logging systems. An audit becomes a reconstruction project.&lt;/p&gt;

&lt;p&gt;A risk record should point to a release version. A metric should point to its definition and dashboard. A launch decision needs an accountable person or role. A feature flag and a tested rollback path carry more weight than a promise to “switch it off quickly.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Give data access its own boundary
&lt;/h2&gt;

&lt;p&gt;Very large platforms and search engines must provide data necessary for supervision to the Commission or the relevant Digital Services Coordinator after a reasoned request. Vetted researchers use a separate Article 40 process to obtain data for studying systemic risks.&lt;/p&gt;

&lt;p&gt;Direct access to production databases creates risks for privacy, trade secrets, and service stability. Ad hoc exports fail more quietly: fields change, metric definitions drift, and two datasets with the same label stop meaning the same thing.&lt;/p&gt;

&lt;p&gt;A usable access layer needs versioned schemas, a data dictionary, de-identification rules, access logs, and a reproducible sampling procedure. It also needs a boundary between evidence required for review and information whose disclosure would create another risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scale controls by reach and consequence
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4leilfmpfgwczz7b70j.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd4leilfmpfgwczz7b70j.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Auditability costs time and infrastructure. Risk records, evaluation suites, instruction versioning, richer logs, and controlled exports add work before release. Building the same stack for a small internal assistant wastes time. We scale controls with the breadth of information the system can reach and the consequence of its answer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User-provided context. Track model and instruction versions, failures, and clear retention boundaries.&lt;/li&gt;
&lt;li&gt;A closed knowledge base. Add document identifiers, permissions, citations, retrieval evaluations, and a reliable way to remove outdated material from the index.&lt;/li&gt;
&lt;li&gt;The open web and a public audience. Add query traces, source sets, diversity checks, harmful-output scenarios, staged rollout, and rapid rollback.&lt;/li&gt;
&lt;li&gt;Large scale or sensitive consequences. Add formal risk assessment, independent-review readiness, reproducible reports, and a controlled data-access layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our rule is simple: once AI selects sources and turns them into one answer, retrieval and generation should be designed as a single auditable decision chain.&lt;/p&gt;

&lt;p&gt;We build AI chatbots, RAG systems, and language-model integrations. In an &lt;a href="https://qtim.pro/services/ai-chatbots?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=chatgpt-vlose-product-architecture&amp;amp;utm_content=cta-bottom" rel="noopener noreferrer"&gt;AI product review&lt;/a&gt;, we can identify the level of control a use case needs and design it into the architecture before the product scales.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
