Kesher mark: two interlocking rings

A worked example · Sales pipeline

What you actually get, end to end.

Most demos stop at "look, the AI built something." This page keeps going — through the tables and rules you get on day one, what your team does with them on a normal Tuesday, and the part nobody shows you: what it takes to change the thing six months later, when the business has moved and the person asking is not an engineer.

Where this usually starts

Today

  • A pipeline spreadsheet only one person really understands
  • Company names typed four different ways
  • Reps can see everyone's numbers, including each other's
  • Nobody knows which campaign produced which closed deal
  • Quotes are a Word file someone copies and edits
  • Every report is rebuilt by hand, monthly

What you ask for

"I need a CRM. Leads come in from our website and events, a rep qualifies them, and the good ones become deals with a quote. I want a pipeline board, and reps should only see their own deals."

That's the whole brief. It's enough.

What comes back

Not a mockup and not a table of empty columns — a working system with real Postgres tables behind it, proposed to you as a plain-language change you approve before anything is created.

Nine linked tables

Lead

Name, email, phone, company, source, campaign, status, notes

Company

The account a deal belongs to

Contact

People at that company, with a unique-email rule

Deal

Title, company, contact, rep, stage, amount, close date

Deal line item

Product, quantity, unit price, discount — line total computed

Deal contact role

Who is the champion, who signs, who blocks

Product

Your priced catalogue

Campaign

What the lead came from, so attribution works

Activity

Calls and meetings, scoped to the rep who logged them

Linked, not just listed. A deal knows its company, its contact, its rep and its campaign, so "closed-won revenue by campaign" is a question the system can already answer rather than a spreadsheet formula someone has to maintain.

Eleven views over them

KanbanLead BoardDrag a lead between statuses
KanbanPipelineDeals by stage, the board your Monday meeting runs on
DashboardPipeline OverviewValue by stage, by rep, by close month
DashboardLead FunnelWhere leads enter and where they die
Time seriesClosed Won Revenue TrendBooked revenue over time
TablesLeads, Deals, Companies, Contacts, Products, CampaignsFilter, sort, bulk edit, export

And the rules underneath

Reps see their own deals — and their team's

A sales rep's access to Deals and Activities is scoped to the rep they belong to. A manager sees their reports' deals too, resolved through the reporting line rather than a list someone maintains by hand. This is enforced on the server, so it holds through the API and an export as well as the screen.

Two contacts can't share an email

A duplicate is refused at the point of saving, with the message you wrote. It holds on every path in — a typed form, a CSV import, the public API, and the one-click conversion below.

Line totals compute themselves

Quantity, unit price and discount produce a line total, and the quote adds up. It isn't a formula in a cell that someone can overwrite.

A normal Tuesday

The test of an internal tool isn't the build. It's whether anyone uses it on an ordinary day.

  1. A lead arrives

    From a form, a CSV of badge scans from last week's conference, or typed in. It lands on the Lead Board with a status and a campaign attached.

  2. A rep qualifies it and clicks Convert to Deal

    One button. Behind it, four things happen together:

    • The company is created
    • The contact is created and linked to that company
    • A deal is created, linked to both, carrying the campaign through, opening at Qualifying
    • The lead is marked Converted, so it can't be converted twice

    All four succeed or none of them do — you never end up with a company and no deal because something failed halfway. And if that contact's email already exists, the whole thing is refused rather than quietly creating the duplicate.

  3. The deal gets a quote

    Add line items from your product catalogue. Totals compute. Then generate the quote as a PDF — a real document with your company's details, the line-item table and the totals, produced from the deal rather than copied from a template someone forgot to update.

  4. It moves across the board

    Drag it through Qualifying, Proposal, Negotiation. The dashboards move with it, because they read the same rows rather than a monthly export.

  5. It closes, and the team hears about it

    Mark it Closed Won and a message posts to your #sales-winsSlack channel with the deal, the amount, the company and the rep. The deal records that it was announced, so it doesn't fire twice.(Connect Slack once, in settings.)

The part other demos skip

Now it's month three and the business has moved.

This is where an internal tool is usually won or lost. The AI built you something good, but it was built from what you knew in month one. Now sales wants a field nobody thought of, finance wants a cut of the data nobody asked for, and the person who needs the change is not an engineer and never will be.

On most platforms this is where you re-prompt an AI and hope, or open a code editor, or file a ticket with a contractor. Here, every one of these is a few clicks in the same builder you started in — because what the AI produced is configuration, not code. There is nothing underneath for anyone to maintain.

"We need to know why we lose deals."

Add a Lost Reason dropdown to Deal, shown only when the stage is Closed Lost, then drop it onto the Lead Funnel dashboard as a breakdown.

Builder → Deal → Add field → Dropdown → type the options → set "show when stage is Closed Lost". Save.

"Reps keep discounting past what we approve."

Add a rule: a line item over 20% discount cannot be saved. It then holds everywhere — the form, a CSV import, the API, and the AI agent.

Builder → Deal line item → Validations → Add rule. Save.

"Finance wants deals split by industry."

Industry already exists on Company. Add it as a grouping on the Pipeline Overview dashboard.

Builder → Views → Pipeline Overview → Group by → Company · Industry. Save.

"Support should see accounts, but nothing about money."

Add a Support role with read access to Company and Contact, and no access to Deal at all.

Builder → Roles → Add role → tick what they may see. Save.

Kesher mark: two interlocking rings

Every one of those changes is something you make yourself, the same way you'd change a setting — and every one is checked before it lands. If a change would affect rows you already have, you're told what it would do to them before it happens, not afterwards.

And when it outgrows being a CRM

The same system keeps going. Not a second subscription, not an integration project — the same tables, the same roles, the same builder.

Invoice the deals you close

Add a finance app with a real double-entry ledger, reading the deals that already exist.

Onboard the customer you won

A project app with tasks and owners, starting from the deal rather than re-typing it.

Hire the reps to sell more

An HR app for the directory and PTO, sharing the same employee records the rep scoping already uses.

Build it and see.

Free until 31 December 2026 while we're in early access. No card. It's a real database from the first minute, and your data is yours to export whenever you want it.