---
title: "Journal · 2 — Orvun Labs"
description: "Practical thinking on product design, software development and the decisions in between."
canonical: "https://orvunlabs.com/en/journal/page/2"
language: "en"
last_modified: "2026-09-14"
---

# Journal · 2

Practical thinking on product design, software development and the decisions in between.

## All topics

- [Planning a product](https://orvunlabs.com/en/journal/topic/planning.md)
- [MVP & validation](https://orvunlabs.com/en/journal/topic/mvp.md)
- [Building SaaS](https://orvunlabs.com/en/journal/topic/saas.md)
- [Applied AI](https://orvunlabs.com/en/journal/topic/ai.md)
- [Connected systems](https://orvunlabs.com/en/journal/topic/integrations.md)
- [Workflow automation](https://orvunlabs.com/en/journal/topic/automation.md)
- [Web & experience](https://orvunlabs.com/en/journal/topic/web.md)
- [Quality & reliability](https://orvunlabs.com/en/journal/topic/design.md)
- [Software modernisation](https://orvunlabs.com/en/journal/topic/rescue.md)
- [Choosing a partner](https://orvunlabs.com/en/journal/topic/partnership.md)

## Journal

- [SaaS onboarding: reach the first useful outcome](https://orvunlabs.com/en/journal/saas-onboarding-first-value.md) — Onboarding should help someone finish the smallest meaningful job, not complete a tour of the interface.
- [What a SaaS admin panel needs to make operations accountable](https://orvunlabs.com/en/journal/saas-admin-roles-reports-audit.md) — An admin panel is an operational tool with privileged actions.
- [Modelling the operating cost of a SaaS product](https://orvunlabs.com/en/journal/saas-operating-cost-model.md) — Separate the cost of keeping the service available from the cost created by each customer and from exceptional support work.
- [Making a chatbot answer from company knowledge reliably](https://orvunlabs.com/en/journal/reliable-company-knowledge-chatbot.md) — Reliability starts with the documents the system is allowed to use and the questions it should decline. Retrieval can bring relevant company material into an answer, but finding a passage do
- [RAG, tool calling or a deterministic query?](https://orvunlabs.com/en/journal/rag-tools-or-deterministic-queries.md) — Choose the mechanism by the authority the answer requires. Retrieval-augmented generation can help explain material in documents. A deterministic query returns structured facts under explici
- [Estimating chatbot cost from users, requests and tokens](https://orvunlabs.com/en/journal/ai-chatbot-cost-assumptions.md) — Start with a usage model before looking for a monthly price. Active users, sessions, messages, input length and output length each change the workload. Include retrieved passages and convers
- [Document extraction needs validation and a review path](https://orvunlabs.com/en/journal/document-extraction-human-review.md) — Extracted text is a candidate record, not an approved business event. Decide which fields matter, how they can be checked and when a person must review them. A confidence score is useful evi
- [Prompt injection and permission boundaries in business AI](https://orvunlabs.com/en/journal/prompt-injection-permission-boundaries.md) — Treat retrieved documents, emails and model output as untrusted inputs. Text can describe an instruction without being authorised to issue it. OWASP identifies prompt injection and excessive
- [API integration: discovery, contracts and failure ownership](https://orvunlabs.com/en/journal/api-integration-discovery-contracts.md) — An integration connects two operating systems, not just two endpoints. Before implementation, define the records exchanged, the authority for each field, authentication, expected timing and
- [Keeping stock, prices and orders consistent between ERP and commerce](https://orvunlabs.com/en/journal/erp-commerce-stock-consistency.md) — Consistency begins by naming the authority for each business fact. Stock, sellable availability, price and order status are not necessarily owned by the same system. Define direction, update
- [CRM synchronisation needs field ownership and conflict rules](https://orvunlabs.com/en/journal/crm-sync-data-ownership.md) — A CRM sync should preserve meaning, not merely copy the newest row. Decide which system owns each field and which changes users are allowed to make locally. Record matching rules and deletio
- [Why webhooks need idempotency, retries and reconciliation](https://orvunlabs.com/en/journal/webhooks-idempotency-retries.md) — A notification arriving is not the same as a business action completing. Design for a sender to deliver an event again and for delivery order to differ from business order. Stripe's webhook

- [Journal 1](https://orvunlabs.com/en/journal.md)
- [Journal 2](https://orvunlabs.com/en/journal/page/2.md)
- [Journal 3](https://orvunlabs.com/en/journal/page/3.md)
- [Journal 4](https://orvunlabs.com/en/journal/page/4.md)
- [Journal 5](https://orvunlabs.com/en/journal/page/5.md)

## Let's make something useful.

A first product, a difficult workflow or software that needs a fresh start. Tell us where you are.

- [Tell us about your project](https://orvunlabs.com/en/contact)

## Structured data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://orvunlabs.com/#organization",
      "name": "Orvun Labs",
      "url": "https://orvunlabs.com",
      "logo": "https://orvunlabs.com/orvunlabs-icon-512.png",
      "description": "Custom software, SaaS products and AI-powered tools — designed around your business.",
      "knowsAbout": [
        "Custom software",
        "SaaS product development",
        "AI integration"
      ]
    },
    {
      "@type": "WebSite",
      "@id": "https://orvunlabs.com/#website",
      "name": "Orvun Labs",
      "url": "https://orvunlabs.com",
      "inLanguage": [
        "en",
        "es",
        "de",
        "fr",
        "pt",
        "ja",
        "hi",
        "ar",
        "id",
        "tr",
        "pl"
      ],
      "publisher": {
        "@id": "https://orvunlabs.com/#organization"
      }
    },
    {
      "@type": "WebPage",
      "@id": "https://orvunlabs.com/en/journal/page/2#webpage",
      "url": "https://orvunlabs.com/en/journal/page/2",
      "name": "Journal · 2",
      "description": "Practical thinking on product design, software development and the decisions in between.",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://orvunlabs.com/#website"
      },
      "about": {
        "@id": "https://orvunlabs.com/#organization"
      },
      "breadcrumb": {
        "@id": "https://orvunlabs.com/en/journal/page/2#breadcrumb"
      }
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://orvunlabs.com/en/journal/page/2#breadcrumb",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Orvun Labs",
          "item": "https://orvunlabs.com/en"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "Journal · 2",
          "item": "https://orvunlabs.com/en/journal/page/2"
        }
      ]
    }
  ]
}
```
