<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Notes — BE Teck</title>
<link>https://be-teck.com/blog/</link>
<atom:link href="https://be-teck.com/blog/feed.xml" rel="self" type="application/rss+xml"/>
<description>Working notes from BE Teck: the gaps we keep finding in ordinary daily work, how a gap becomes something built, and what we have built so far.</description>
<language>en-in</language>
<lastBuildDate>Tue, 01 Sep 2026 22:45:00 +0530</lastBuildDate>
<item><title>The site and the head office are looking at different numbers</title><link>https://be-teck.com/blog/the-site-to-head-office-gap/</link><guid isPermaLink="true">https://be-teck.com/blog/the-site-to-head-office-gap/</guid><pubDate>Tue, 01 Sep 2026 22:45:00 +0530</pubDate><description>The site records what physically happened and the office records what was ordered and paid. They diverge for structural reasons, not because anyone is lying.</description><category>builders</category><category>site</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Ask the site how much cement is on the project. Ask the head office the same question. You will get two numbers, and both people will be certain.</p>
<p>Neither is lying. The two numbers answer different questions that happen to share a sentence. The site knows physical reality — what came through the gate, what went into the work, who was present this morning. The head office knows commercial reality — what was ordered, what has been billed, what has been paid.</p>
<p>The gap between them is structural. It is produced by the way each side records, and it would exist in an office of entirely honest people.</p>
<h2 id="different-moment-different-unit-different-purpose">Different moment, different unit, different purpose<a class="anchor" href="#different-moment-different-unit-different-purpose" aria-label="Link to this section">#</a></h2>
<p>A site record is made at the instant something physically happens. A lorry comes through the gate at eleven and the storekeeper writes it down at eleven. The purpose of that record is control: is the material here, is it the right material, can the work start.</p>
<p>An office record is made when a commercial obligation crystallises. The invoice arrives some days later and is entered against the order. Its purpose is money: what do we owe, to whom, by when.</p>
<p>Both records describe the same lorry. They are written on different days, by people with different training, for readers who need different things. Then somebody asks a question that assumes they are one record.</p>
<h2 id="the-gaps-that-open-on-their-own">The gaps that open on their own<a class="anchor" href="#the-gaps-that-open-on-their-own" aria-label="Link to this section">#</a></h2>
<p><strong>Material received, not yet invoiced.</strong> The commonest one. Stock is on site and the ledger shows nothing. At month end the site's consumption looks impossible against the office's purchases.</p>
<p><strong>Invoiced, not yet received.</strong> The reverse. Money is committed and payable for material still on a lorry, still on the vendor's floor, or dispatched to another site by mistake.</p>
<p><strong>Bags at the gate, tonnes in the ledger.</strong> The site counts what it can physically count. The office bills in the contract unit. Neither is wrong. Every conversion is an opportunity, and <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure</a> is where the quiet errors live.</p>
<p><strong>A rate revised verbally at site.</strong> The project manager agrees a new rate with a supplier because the lorry is at the barrier and cannot wait. The order in the office still carries the old rate. The invoice will match neither.</p>
<p><strong>Work certified but not billed.</strong> The engineer measures and certifies. The contractor has not yet raised the bill. The site believes a liability exists; the office cannot see it, because no document has arrived.</p>
<p><strong>An advance the site does not know about.</strong> Money moved before material did, for commercial reasons that never travelled to the site. The site takes a load it believes is unpaid and treats it as a fresh liability.</p>
<p><strong>Rejected material.</strong> The gate refuses a load and sends it back. If the rejection lives only in a phone call, the office has an order it thinks is fulfilled and the site has nothing.</p>
<p>Every one of these is an ordinary event. None requires dishonesty. Together they guarantee that two independently maintained sets of books will differ.</p>
<h2 id="the-reconciliation-ritual">The reconciliation ritual<a class="anchor" href="#the-reconciliation-ritual" aria-label="Link to this section">#</a></h2>
<p>So there is a meeting. Monthly, usually late in the month, with the site printing its sheets and accounts printing theirs.</p>
<p>It compares totals. That is why it fails.</p>
<p>Two totals differ by some amount, and the meeting now has to reconstruct, from memory and from paper, which events explain the difference. It has an hour. Some of the events are three weeks old and the man who witnessed them is at another site. So the meeting does what meetings do: it agrees a figure, records the difference as an adjustment, and moves on.</p>
<p>The adjustment is the damage. It closes the arithmetic without closing the cause. Next month the same class of gap opens again, because nothing about the recording changed. After a year the adjustments are themselves a body of history nobody can explain, and <a href="https://be-teck.com/blog/stock-reconciliation/">stock reconciliation</a> turns into archaeology.</p>
<p>A reconciliation of totals can only tell you <em>that</em> you differ. A reconciliation of events tells you <em>why</em>, and the why is the only part that stops a repeat.</p>
<h2 id="two-books-or-one-record">Two books, or one record<a class="anchor" href="#two-books-or-one-record" aria-label="Link to this section">#</a></h2>
<p>The usual response is to make the site's book better — a stricter format, a weekly return, a new template. That improves one of the two divergent records. It does not stop them diverging.</p>
<p>What closes the gap is a change of shape: one event, recorded once, at the place and moment it happened, read by both sides.</p>
<p>The lorry arrives. The man at the gate records the arrival — vehicle, material, quantity as counted, condition, time — and that entry is the <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt note</a>, not a transcription of the vendor's challan. Nobody re-keys it in the office. When the invoice comes, it is held against that same record rather than against a second one written later from a photograph.</p>
<p>Three consequences are worth stating separately.</p>
<p><strong>The record is authored where the fact is known.</strong> A storekeeper knows how many bags came off the lorry. An accountant three hundred kilometres away knows what the invoice says. Asking either to author the other's fact produces a guess with a signature on it.</p>
<p><strong>Nobody re-keys.</strong> Re-keying is where units drift, and it is also the moment the second version of the truth is born.</p>
<p><strong>Both sides read the same row.</strong> Not a summary of it. The office should be able to see the gate entry with its time on it; the site should be able to see whether that load has been invoiced and paid.</p>
<p>A store run this way — the shape described in <a href="https://be-teck.com/blog/running-a-site-store/">running a site store</a> — costs the storekeeper a few minutes at the barrier and saves the monthly meeting altogether.</p>
<h2 id="what-is-left-over-is-real">What is left over is real<a class="anchor" href="#what-is-left-over-is-real" aria-label="Link to this section">#</a></h2>
<p>Even with one record, differences remain. Material genuinely in transit. Invoices genuinely not raised. A payment that has left the bank and not yet reached the vendor.</p>
<p>These are timing differences and they are supposed to exist. The value of recording each event once is that the leftovers are few, small and nameable — a list of items rather than a number. It is the same discipline that makes <a href="https://be-teck.com/blog/matching-a-bank-line/">matching a bank line</a> tractable: you are not reconciling two opinions, you are accounting for a handful of items whose timing you can state.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Site and office differ because they record different moments, in different units, for different purposes. That is structural, not moral.</p>
<p>Reconciling totals hides the causes and guarantees a repeat. Reconciling events finds them. The permanent fix is to stop keeping two books: capture the event once where it happens, let both sides read the same row, and let the remaining differences be the small ones that are genuinely about timing.</p>]]></content:encoded></item>
<item><title>Reported progress and real progress</title><link>https://be-teck.com/blog/progress-reported-and-progress-real/</link><guid isPermaLink="true">https://be-teck.com/blog/progress-reported-and-progress-real/</guid><pubDate>Tue, 01 Sep 2026 22:40:00 +0530</pubDate><description>The percentage in a weekly report is a judgement made by the person who will be blamed if it is low. Quantities and binary milestones survive that pressure.</description><category>builders</category><category>site</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The figure in the weekly report is almost always ahead of the site. Everybody who has run a project knows this, and most organisations respond by discounting the number in their heads rather than fixing the number.</p>
<p>The discount is not a fix. It is an agreement to keep producing a document nobody trusts.</p>
<h2 id="a-percentage-is-a-judgement-not-a-measurement">A percentage is a judgement, not a measurement<a class="anchor" href="#a-percentage-is-a-judgement-not-a-measurement" aria-label="Link to this section">#</a></h2>
<p>A quantity is measured. A percentage complete is estimated. Between those two sentences sits every problem this post is about.</p>
<p>To say a slab is sixty per cent done, somebody has to decide what the remaining forty per cent contains, how long it will take, and how the parts compare in effort. That is a forecast wearing the clothes of an observation. It looks like data on the report because it has a number in it.</p>
<p>And it is a forecast made by a particular person: the one who will be questioned if it is low. Nobody in that position is being dishonest. They are being reasonable in the way people are reasonable under pressure — the reinforcement is tied, the shuttering is nearly ready, the pour is arranged for Thursday, so the honest feeling is that this is mostly done.</p>
<h2 id="why-the-number-only-drifts-one-way">Why the number only drifts one way<a class="anchor" href="#why-the-number-only-drifts-one-way" aria-label="Link to this section">#</a></h2>
<p>Optimism in progress reporting is not random noise. It has a direction, and the direction is structural.</p>
<p><strong>The reporter is the reviewed.</strong> The person estimating progress is the person whose performance is read off the estimate.</p>
<p><strong>The invisible work is at the end.</strong> Testing, finishing, snagging, the services that only reveal their problems at commissioning. Early work is visible and satisfying. Late work is fiddly and easy to underestimate.</p>
<p><strong>Started reads as half done.</strong> Once a trade is on site, the item stops being zero. In practice a great deal of started work sits at very little value for a long time.</p>
<p><strong>Nobody is punished for correcting upward.</strong> Reporting more this week than last is comfortable. Reporting less requires an explanation, so a figure that should fall is held flat instead.</p>
<p>That last one produces the plateau everybody recognises. An item reaches ninety per cent and stays there for weeks, because it cannot go down and it cannot honestly go up. The plateau is not a measure of the work. It is a measure of what the reporting system will accept.</p>
<h2 id="measures-that-cannot-be-argued-with">Measures that cannot be argued with<a class="anchor" href="#measures-that-cannot-be-argued-with" aria-label="Link to this section">#</a></h2>
<p>The alternative is not a better estimate. It is a different kind of statement.</p>
<p><strong>Physical quantities against the bill of quantities.</strong> Cubic metres poured, tonnes of steel fixed, square metres plastered, against the scheduled quantity. This is a count, not an opinion, and the schedule already contains the denominator — the structure is set out in <a href="https://be-teck.com/blog/reading-a-bill-of-quantities/">reading a bill of quantities</a>. It also has the advantage of matching the way the job will eventually be billed, so progress and money stop being two unrelated stories.</p>
<p><strong>Binary milestones.</strong> Either the slab is cast or it is not. Either the lift is commissioned or it is not. A milestone that can be half achieved is not a milestone, it is a percentage with a name on it. Define milestones so the answer is yes or no, put a date against each, and record the date it actually happened rather than the date it was supposed to.</p>
<p><strong>Value earned, in outline.</strong> Take the scheduled value of the work actually completed and compare it with the value scheduled to have been completed by now. That is the whole idea. There is a large formal apparatus around it and most projects do not need the apparatus; they need the comparison. Two numbers, both derived from quantities, neither of them a judgement about effort.</p>
<p><strong>Photographs with a date and a location.</strong> Not decoration on the report — a record. A photograph does not claim a percentage, and it cannot be revised next week to suit the meeting. What makes it evidence rather than a picture is covered in <a href="https://be-teck.com/blog/a-site-photograph-is-a-record/">a site photograph is a record</a>.</p>
<p>The common property of all four is that they do not require the reporter to predict anything. They ask what happened, and what happened is a fact somebody witnessed.</p>
<h2 id="the-chain-that-turns-a-number-into-fiction">The chain that turns a number into fiction<a class="anchor" href="#the-chain-that-turns-a-number-into-fiction" aria-label="Link to this section">#</a></h2>
<p>Even honest estimates degrade as they travel.</p>
<p>The engineer rounds up a little, because the last shuttering will be up by Monday. The site in charge consolidates several such figures and rounds the consolidation up, because he does not want to report a fall on a package he knows is moving. The project head reports upward against a target he committed to. The board sees a summary of summaries.</p>
<p>No one lied. Each step applied a small, defensible optimism to a number that already contained one. By the fourth level the figure has no relationship to the site at all, and — worse — it cannot be audited, because there is no underlying event to check it against. You cannot verify a percentage. You can verify a pour.</p>
<p>This is the deep argument for reporting quantities upward rather than percentages. A quantity survives aggregation. Cubic metres add up honestly at every level and can be checked against <a href="https://be-teck.com/blog/measured-and-docketed-quantity/">measured and docketed quantity</a> whenever anybody doubts them. A percentage cannot even be added up correctly without weights, and the weights are usually nobody's job.</p>
<h2 id="what-to-change-on-monday">What to change on Monday<a class="anchor" href="#what-to-change-on-monday" aria-label="Link to this section">#</a></h2>
<p>Three changes, in order of how much they cost.</p>
<ol><li><strong>Report quantities, not percentages.</strong> Let the percentage be calculated from the quantity and the schedule, by whoever wants one. Nobody types a percentage into a form again.</li><li><strong>Make milestones binary and dated.</strong> Cast, commissioned, tested, handed over. Record the actual date, not the planned one, and keep both so slippage is visible without a meeting.</li><li><strong>Separate reporting from judging.</strong> As far as the organisation can manage it, the person who records what happened should not be the person whose appraisal depends on it. Where that is impossible — and on a small site it often is — make the record so factual that judgement has nothing to grip: quantities, dates, photographs.</li></ol>
<p>The daily record is where this either works or does not. If the site's own <a href="https://be-teck.com/blog/the-daily-progress-report/">daily progress report</a> already carries quantities, labour present and plant deployed, the weekly figure can be built from it rather than composed for the meeting. If the daily record is a paragraph of prose, the weekly figure will always be an opinion, however sincere.</p>
<h2 id="the-number-we-refused-to-print">The number we refused to print<a class="anchor" href="#the-number-we-refused-to-print" aria-label="Link to this section">#</a></h2>
<p>We build a site status screen. It reports the floor reached, what is blocking work, what material is awaited, and what falls due this week. It shows no progress percentage at all, and that is a decision rather than an omission.</p>
<p>Nothing in the records measures how much of a slab is done. We hold deliveries, attendance, tasks, bills and photographs, and not one of them answers that question. A figure assembled from them would have been arithmetic performed on an opinion — and it would have been read as a measurement, because a number on a screen always is.</p>
<p>Leaving that space empty is uncomfortable. Every screen wants a headline figure. A screen that says what it knows and then stops is worth more than one that says what it was asked for.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Reported progress runs ahead of real progress because a percentage is a forecast made by the person being marked on it, and because every level of the chain rounds the same way.</p>
<p>Report what happened instead: quantities against the schedule, milestones that are yes or no, dates that are actual, photographs that carry a place and a time. Let anyone who wants a percentage calculate one. The estimate will still be optimistic. The record underneath it will not.</p>]]></content:encoded></item>
<item><title>Why a lorry surprises the gate</title><link>https://be-teck.com/blog/before-the-lorry-reaches-the-gate/</link><guid isPermaLink="true">https://be-teck.com/blog/before-the-lorry-reaches-the-gate/</guid><pubDate>Tue, 01 Sep 2026 22:35:00 +0530</pubDate><description>The office knows a load is coming and the man at the barrier does not. What the gate needs before a vehicle arrives, and what goes wrong when it has nothing.</description><category>site</category><category>stores</category><category>field</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A lorry arrives at the site gate. The man at the barrier has no idea it was coming.</p>
<p>Somewhere in the office, three people knew. An order was placed a fortnight ago. A dispatch was confirmed yesterday on a phone call. A vehicle number came through on WhatsApp this morning. None of it reached the barrier, and the barrier is where the decision has to be made.</p>
<h2 id="what-happens-when-the-gate-knows-nothing">What happens when the gate knows nothing<a class="anchor" href="#what-happens-when-the-gate-knows-nothing" aria-label="Link to this section">#</a></h2>
<p>The man at the gate is in no position to refuse. He has no list, so he has no basis, and a driver who has come a long way is not going to accept "I have not been told" as an answer. Behind him a supervisor wants the material. So the default is always yes.</p>
<p>Everything that follows comes from that yes.</p>
<p><strong>The wrong material is unloaded.</strong> Nobody at the gate can compare the load against an order, because there is no order in front of him. The mismatch is discovered at issue, weeks later, by which time it has been signed for.</p>
<p><strong>A load meant for another site is accepted.</strong> Same vendor, similar material, two projects. The driver takes the nearer gate. The receiving site's stock is overstated and another site's is short, and both discover it at stock-taking.</p>
<p><strong>A short load is signed as full.</strong> With no expected quantity, the only figure available is the one printed on the vendor's paper. Counting against the challan is not verification; it is transcription, which is precisely the fault that hollows out a <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt note</a>.</p>
<p><strong>The vehicle waits.</strong> Nobody can authorise unloading, or the crane is committed elsewhere, or the storekeeper has gone to another block. Detention and demand charges start running against the account, and the argument about who pays them happens months later with no record of when the vehicle actually arrived.</p>
<p><strong>Nothing reaches the office.</strong> The load is in. The entry is in a register in a cabin. Accounts finds out when the invoice arrives, which is the wrong direction for information to travel.</p>
<h2 id="the-specific-ways-the-information-fails-to-arrive">The specific ways the information fails to arrive<a class="anchor" href="#the-specific-ways-the-information-fails-to-arrive" aria-label="Link to this section">#</a></h2>
<p>It is tempting to say the office should simply tell the gate. Offices do try. The failures are worth naming, because each one defeats a different fix.</p>
<p><strong>Dispatch confirmed on a phone call.</strong> The purchase officer knows. He is on another call when the lorry arrives, and there is no artefact anywhere that says a load was expected today.</p>
<p><strong>The vehicle number changes at the last moment.</strong> A truck breaks down, a transporter substitutes another, the number shared in the morning is not the number at the barrier. A gate instructed to check the number now has grounds to refuse a load that is entirely legitimate, which teaches everyone to stop checking the number.</p>
<p><strong>A partial dispatch against a large order.</strong> The order is for a quantity the vendor will deliver over several vehicles. The gate has no way to know whether this load is the first, the fourth or a duplicate — and no running balance against which to see it.</p>
<p><strong>Deliveries outside working hours.</strong> Late at night, on a Sunday, during the one hour the storekeeper is at the bank. The people who can check are absent, and the people present can only open the barrier.</p>
<p><strong>Free material, samples and replacements.</strong> No order exists at all. A replacement for a rejected load is often sent with paper that references nothing, and a gate process that requires an order number cannot record it.</p>
<p><strong>Direct-to-site purchases.</strong> A supervisor buys locally in cash for an urgent kaam. The material is real, the need was real, and no purchase order will ever exist. If the gate can only record what the office ordered, this load enters the site invisibly.</p>
<h2 id="what-the-gate-actually-needs">What the gate actually needs<a class="anchor" href="#what-the-gate-actually-needs" aria-label="Link to this section">#</a></h2>
<p>Not a system. A short, specific set of facts, available at the barrier, without a phone call.</p>
<p><strong>Today's expected deliveries.</strong> For each one: vendor, material, expected quantity, order reference, and the vehicle number if it is known — marked as indicative, not as a gate condition. The gate's job is to notice a mismatch and raise it, not to enforce a number that legitimately changes.</p>
<p><strong>A running balance against each open order.</strong> So that the fourth lorry against an order is visibly the fourth, and a quantity that would take the order past its total is visible as it happens, not at invoice stage.</p>
<p><strong>A way to record the unexpected.</strong> This is the part most designs get wrong. A gate that can only record expected loads will turn away legitimate material or, far more often, let it in without a record. The correct behaviour is to accept and record it as unexpected — vendor, material, quantity counted, photograph, who authorised entry — and let the office resolve what it belongs to afterwards. An unmatched entry that exists can be investigated. A load that was never written down cannot.</p>
<p><strong>A way to record a refusal.</strong> Rejected loads leave no trace in most sites, which means the order still looks fulfilled and the vendor's version of events is the only one that survives.</p>
<p><strong>Onward travel by itself.</strong> The entry should reach the store and the office without anybody re-typing it. The register in the cabin is a real record — the practical shape of one is in <a href="https://be-teck.com/blog/a-gate-register-people-keep/">a gate register people keep</a> — but a record that stays in the cabin protects nothing until the day of the dispute.</p>
<h2 id="the-paper-the-driver-carries-is-not-the-record">The paper the driver carries is not the record<a class="anchor" href="#the-paper-the-driver-carries-is-not-the-record" aria-label="Link to this section">#</a></h2>
<p>The driver hands over a delivery challan. It is a useful document and it is the vendor's document: it states what the vendor says he sent, in the vendor's units, signed by the vendor's man. Its purpose and its limits are set out in <a href="https://be-teck.com/blog/what-is-a-delivery-challan/">what is a delivery challan</a>.</p>
<p>Your record is the one your side writes, at the barrier, from what your side counted. Signing the driver's copy is an acknowledgment of receipt of a vehicle, not agreement with its contents, and the difference between those two things is the whole reason to write anything down at all. The same discipline runs through <a href="https://be-teck.com/blog/running-a-site-store/">running a site store</a>: count first, write your own figure, note the difference on both copies before the lorry leaves.</p>
<h2 id="two-things-we-found-in-our-own-gate">Two things we found in our own gate<a class="anchor" href="#two-things-we-found-in-our-own-gate" aria-label="Link to this section">#</a></h2>
<p>Our gate screen recorded that a vehicle had come in, and that was all it recorded. The entry wrote no material receipt, so there was nothing on our side for a supplier's billed quantity to be compared against. Nobody had switched the comparison off. There was simply never a figure of our own to compare with, and a comparison that never runs raises no alarm.</p>
<p>The second was the register itself. The physical book in the cabin held things our software had never held: the receiving officer's name, the challan number, the rate, the slump reading, the cube results. When we read that book in and matched it against what had reached us through the phone, the book turned out to be the better record. It had been kept faithfully for years by somebody nobody was asking.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A lorry surprises the gate because the information that it was coming stayed in the office. The man at the barrier then has no basis to refuse, so he accepts everything.</p>
<p>Give the gate today's expected loads with quantities and an order balance; allow it to record what was not expected and what was turned away; and let the entry travel to the store and the office on its own. The barrier is the first place your side can state a fact about a delivery. It is also the last place it is cheap to state.</p>]]></content:encoded></item>
<item><title>A snag list that actually closes</title><link>https://be-teck.com/blog/the-snag-list-that-closes/</link><guid isPermaLink="true">https://be-teck.com/blog/the-snag-list-that-closes/</guid><pubDate>Tue, 01 Sep 2026 22:30:00 +0530</pubDate><description>Most snag lists never close because a snag has no identity, no owner and no closure test. What a list needs if it is to shrink instead of being reissued.</description><category>builders</category><category>site</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Snagging is the last thing that happens on a project and the first thing to be organised badly. A walk is done, defects are noted, a list goes to the contractor, and then the list does not close. It gets reissued, and longer at each reissue, because each walk finds new items and cannot tell which of the old ones were fixed.</p>
<p>The list is not failing because the fixing is slow. It is failing because of what a snag record does not contain.</p>
<h2 id="why-the-list-never-shrinks">Why the list never shrinks<a class="anchor" href="#why-the-list-never-shrinks" aria-label="Link to this section">#</a></h2>
<p><strong>No identity.</strong> A snag is a line in a document, not a thing with a number. The same cracked tile is reported by the architect on Tuesday, the client's representative on Thursday, and the facilities engineer next month, in three different wordings. Nobody can tell they are one defect, so it is fixed once and closed nowhere.</p>
<p><strong>No owner.</strong> The list is addressed to "the contractor". A project at handover has many contractors, and a defect that belongs to everybody belongs to nobody. This is the ordinary mechanism by which <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">tasks stall between people</a>: the item is not refused, it is simply never picked up.</p>
<p><strong>No location precise enough to return to.</strong> "Bathroom tile chipped" is useless in a building of identical bathrooms. The man sent to fix it has to find it first, and if he cannot, he fixes the nearest plausible one.</p>
<p><strong>No evidence of the original defect.</strong> Three weeks later the fixer says it was always like that, or that it was damaged after his work. Without a dated photograph of the defect as first seen, this is one person's word against another's, and it is usually settled by whoever is more senior rather than by whoever is right.</p>
<p><strong>No closure test.</strong> "Done" is a message. Somebody says it is done, the line is struck through, and nobody looked. At the next walk the same item reappears and the list has lost the little credibility it had.</p>
<p><strong>No state between open and closed.</strong> A snag waiting for material, a snag disputed, a snag that cannot be reached until scaffolding returns — all of them sit in the same "open" bucket as a five-minute job, so the count tells you nothing about what is actually blocked.</p>
<h2 id="four-different-things-wearing-one-name">Four different things wearing one name<a class="anchor" href="#four-different-things-wearing-one-name" aria-label="Link to this section">#</a></h2>
<p>Treating every line as "a snag" is why the list feels endless. There are at least four categories, and they need different handling and different money.</p>
<p><strong>A defect.</strong> Work that was done and done wrongly. The contractor fixes it at his cost. No argument in principle, only about whether it is a defect.</p>
<p><strong>Incomplete work.</strong> Not defective — absent. A socket that was never installed. This is not snagging at all; it belongs against the original scope and against the bill, and putting it on a snag list disguises the fact that the work is not finished and should not have been offered for handover.</p>
<p><strong>Damage caused by another trade.</strong> The painter marks the finished floor, the plumber cuts the finished wall. The defect is real and the party who must fix it is not the party who owns the element. Without a category for this, the tiler is asked to redo work he did correctly, and he refuses, and the item sits.</p>
<p><strong>A change the customer wants.</strong> Not a defect. A different colour, a socket moved. It has to leave the snag list and enter the variation process with a price, otherwise the list becomes the route by which unpriced scope enters the job at the end.</p>
<p>Recording the category at the moment of raising costs nothing and decides who pays, which is the argument that would otherwise happen twice.</p>
<h2 id="the-second-walk-and-the-third">The second walk, and the third<a class="anchor" href="#the-second-walk-and-the-third" aria-label="Link to this section">#</a></h2>
<p>Re-snagging is normal and should be designed for, not treated as failure.</p>
<p>The first walk produces the list. The second checks the fixes and finds new items, because access has changed and protection has come off. A third is common. What matters is that each walk can tell, item by item, what it is checking: a closed item being verified, an open one being chased, or something genuinely new.</p>
<p>That requires the snag to be the same object across all three walks. A list regenerated from scratch each time cannot do it, which is why the reissued spreadsheet grows.</p>
<p>Two failures deserve naming.</p>
<p><strong>Closure by the fixer.</strong> The party who did the work marks it done. This is not closure, it is a claim of completion. Closure is an act by somebody else.</p>
<p><strong>Closure by exhaustion.</strong> The date arrives, the list is long, and the remaining items are agreed to be "minor" and carried into a document nobody opens again. Six months later the same items arrive as complaints.</p>
<h2 id="the-shape-that-works">The shape that works<a class="anchor" href="#the-shape-that-works" aria-label="Link to this section">#</a></h2>
<p>One snag, one row. On that row:</p>
<ul><li><strong>One identifier.</strong> Assigned when raised, never reused, never renumbered.</li><li><strong>One location.</strong> Unit, floor, room, element — precise enough that a man with the identifier and no other context can stand in front of it.</li><li><strong>One photograph of the defect</strong> as first seen, dated and located. What makes such a picture evidence rather than decoration is the subject of <a href="https://be-teck.com/blog/a-site-photograph-is-a-record/">a site photograph is a record</a>.</li><li><strong>One category</strong> — defect, incomplete, damage by others, customer change.</li><li><strong>One named owner</strong>, a person, not a firm.</li><li><strong>One closure photograph</strong> taken after the fix, from the same position.</li><li><strong>One closing party who is not the fixing party.</strong></li></ul>
<p>That last line decides whether the list closes. Everything else is bookkeeping; separating doing from accepting is what makes "done" mean something. It is the same principle that makes a <a href="https://be-teck.com/blog/what-makes-a-handover-fail/">handover fail or hold</a>: somebody other than the man who produced the work has to accept it.</p>
<h2 id="why-the-spreadsheet-gives-up-exactly-when-you-need-it">Why the spreadsheet gives up exactly when you need it<a class="anchor" href="#why-the-spreadsheet-gives-up-exactly-when-you-need-it" aria-label="Link to this section">#</a></h2>
<p>A spreadsheet is fine for thirty items on one walk. It fails at the moment the list gets long, and it fails in a particular way.</p>
<p>Several people walk different floors on the same day and each fills a copy. The copies are merged by hand, so duplicates survive and identifiers collide. Photographs live in a phone gallery or a WhatsApp group, in neither case attached to the row. And the file has no history, so when a closed item reopens nobody can see who closed it or on what basis.</p>
<p>Whatever the list is kept in, the requirement is the same: a snag must be a record with a life, not a line in a regenerated document. And the list in the state it was on the day, open items named and owned, belongs in <a href="https://be-teck.com/blog/the-handover-file/">the handover file</a> — not a clean sheet that pretends there were none.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A snag list closes when each snag is a thing rather than a sentence: one identifier, one location, one photograph, one category, one owner, one closure photograph.</p>
<p>The person who fixes must not be the person who closes. And incomplete work and customer changes must be taken off the list entirely, because a list that contains four kinds of item cannot be finished — only abandoned.</p>]]></content:encoded></item>
<item><title>What belongs in a handover file</title><link>https://be-teck.com/blog/the-handover-file/</link><guid isPermaLink="true">https://be-teck.com/blog/the-handover-file/</guid><pubDate>Tue, 01 Sep 2026 22:25:00 +0530</pubDate><description>The handover file is assembled at the end, which is why it is always incomplete. What belongs in it, why each item is needed later, and the habit that fixes it.</description><category>builders</category><category>records</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>At completion, a set of documents changes hands — to a buyer, to a society, to a facilities team. It is called the handover file, the O&amp;M manual, the completion set. The name varies. The problem does not.</p>
<p>The file is almost always assembled in the last fortnight of a job that took years, from documents created by people who have since left. That single fact explains every gap in it.</p>
<h2 id="what-it-should-contain-and-why">What it should contain, and why<a class="anchor" href="#what-it-should-contain-and-why" aria-label="Link to this section">#</a></h2>
<p>The test for each item is not "was it important during construction". It is "will somebody need it in three years, when nobody who built this is reachable".</p>
<p><strong>As-built drawings.</strong> Not the tender drawings, not the good-for-construction set — the drawings as the thing was actually built, with the deviations marked. The first person to drill into a wall needs to know where the conduit actually went.</p>
<p><strong>Approved drawings and the approvals themselves.</strong> The stamped set and the sanctions attached to it. Later — at resale, at a loan, at any alteration — somebody will ask what was approved rather than what was drawn. Requirements differ by state and by authority, so verify what your own jurisdiction demands rather than copying a list from a previous project.</p>
<p><strong>Equipment manuals and warranty documents, with their start dates.</strong> A warranty without its start date is not a warranty; it is a leaflet. The date it begins, what it covers, what voids it, and the name of the party who honours it. That party is often the supplier, not the contractor.</p>
<p><strong>Test certificates.</strong> Concrete cubes, water, electrical, lift, fire, pressure tests on plumbing. These are the evidence that the thing was verified when it could still be verified. The cube results in particular are unrepeatable — the argument about why they matter and what they actually prove is in <a href="https://be-teck.com/blog/the-concrete-cube-test/">the concrete cube test</a>.</p>
<p><strong>Commissioning records.</strong> Who started the system, on what date, with what settings, and what was observed. When a pump behaves oddly two years later, the first useful question is how it behaved on day one.</p>
<p><strong>Service provider contacts.</strong> The firm that installed the lift, the one that serviced the fire panel, the electrical contractor. Names and numbers, and whose contract they sat under. It is the item most often skipped and the one most often needed first.</p>
<p><strong>Meter readings at the moment of handover.</strong> Electricity, water, gas, with the date and the meter serial. This one line prevents a dispute about who owes for consumption before the handover, and it is impossible to reconstruct afterwards.</p>
<p><strong>The snag list in the state it was on the day.</strong> Not a clean sheet. The open items, their owners and the agreed dates. A handover claiming there were no open snags is believed by nobody — the discipline is in <a href="https://be-teck.com/blog/the-snag-list-that-closes/">a snag list that actually closes</a>.</p>
<p><strong>A signed acknowledgment of what was actually handed over.</strong> An index, signed by both sides, listing what is in the file and what is not. A file with an honest list of its gaps is far more useful than one implying a completeness it does not have.</p>
<p><strong>Keys, access cards and administrator credentials.</strong> For the access control, the BMS, the CCTV. These are routinely handed to one individual and lost when he moves on.</p>
<h2 id="why-it-is-always-incomplete">Why it is always incomplete<a class="anchor" href="#why-it-is-always-incomplete" aria-label="Link to this section">#</a></h2>
<p>Because it is assembled at the end. That is the whole of the answer; the mechanics are worth one level of detail.</p>
<p><strong>The documents were created over years by many parties.</strong> A test certificate went to a site engineer who filed it in a cabin since dismantled. A warranty came by email to a purchase officer who has left.</p>
<p><strong>The people who could identify a document have gone.</strong> Somebody finds a stack of certificates in the last fortnight and cannot tell which pour they belong to, because the detail lived in the head of the man who received them.</p>
<p><strong>Nobody's performance depends on it.</strong> The project is measured on completion and on cost. The file is a task assigned late, to a junior, with no authority to compel the subcontractors who hold half the documents — and those subcontractors have already been paid, or are arguing about their final bills.</p>
<p><strong>The commercial pressure runs the other way.</strong> Everybody wants the handover to happen, and a missing manual is not going to stop it. The file is accepted as it stands and the gaps become somebody else's, later.</p>
<h2 id="file-at-creation-not-at-completion">File at creation, not at completion<a class="anchor" href="#file-at-creation-not-at-completion" aria-label="Link to this section">#</a></h2>
<p>There is one habit that fixes this, and it is not a bigger effort at the end.</p>
<p>When a document is created, file it then, in the place it will finally live, with the identifying detail attached while somebody still knows it. The cube result goes against the pour on the day it arrives. The warranty goes against the equipment on the day it is received. The as-built markup is made when the deviation happens, not reconstructed a year later.</p>
<p>This is not more work in total. It is the same work, done when it is cheap rather than when it is expensive, by the person who knows the answer rather than the one who has to guess it.</p>
<p>The practical form is an index defined at the start of the project — the sections the file will have on the last day — and a rule that every certificate, manual and approval enters its section on arrival. Then the file is already assembled, and somebody checks it instead of building it.</p>
<h2 id="a-copy-is-not-the-record">A copy is not the record<a class="anchor" href="#a-copy-is-not-the-record" aria-label="Link to this section">#</a></h2>
<p>There is a difference between handing over a copy and handing over the record, and it decides what the file is worth in a dispute.</p>
<p>A copy is a scan or a photocopy in a binder. It proves what somebody chose to put in a binder. Anybody who has assembled such a file knows how easily a page is swapped, a date corrected, a version quietly replaced with a later one.</p>
<p>Handing over the record means the receiving side gets the document with its provenance: when it was created, by whom, what it superseded, and evidence it has not been altered since. That is the difference between a document you possess and one you can rely on, and the mechanics are in <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident documents</a>.</p>
<p>It matters most for the items argued about later — as-built drawings, test certificates, warranty start dates — the pages where a small change is valuable to somebody and invisible to everybody else. A file whose contents cannot be shown to be the originals is evidence of good intent, not of fact, and <a href="https://be-teck.com/blog/what-makes-a-handover-fail/">what makes a handover fail</a> usually comes down to that gap.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The handover file is needed years after handover, by people who cannot ask anybody. Its contents should be chosen on that basis: as-builts, approvals, manuals and warranties with dates, test and commissioning records, contacts, meter readings, the open snag list, and a signed index naming the gaps.</p>
<p>It is incomplete because it is assembled at the end. File each document at creation instead, in the section it will finally sit in. And hand over the record with its provenance, not a binder of copies.</p>]]></content:encoded></item>
<item><title>The paper trail a query demands</title><link>https://be-teck.com/blog/the-paper-trail-a-query-demands/</link><guid isPermaLink="true">https://be-teck.com/blog/the-paper-trail-a-query-demands/</guid><pubDate>Tue, 01 Sep 2026 22:20:00 +0530</pubDate><description>Years later somebody asks you to substantiate a decision. What survives is a dated record, a named author, an unedited document and proof it was sent.</description><category>builders</category><category>records</category><category>accounts</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A query arrives long after the work. An authority asks why a particular payment was released. A lender's diligence team asks who approved a change in scope. Your auditor asks which version of a drawing the slab was cast to. A buyer's advocate asks what your side committed to, and when. A tribunal asks what you knew on a date.</p>
<p>None of them is asking to see your system. Nobody has ever asked a builder to demonstrate software.</p>
<p>The question is always narrower and always the same shape: <em>show me the decision, and who made it, on the date you say it was made.</em> That is a smaller thing than the pile of paper most offices keep, and most offices still cannot produce it.</p>
<h2 id="the-four-parts-of-an-answer-that-holds">The four parts of an answer that holds<a class="anchor" href="#the-four-parts-of-an-answer-that-holds" aria-label="Link to this section">#</a></h2>
<p>A defensible answer has four parts, and it is only as strong as the weakest of them.</p>
<ul><li><strong>A record made at the time.</strong> Not a note written afterwards describing what happened. A record whose own date sits inside the period it describes.</li><li><strong>An identified person.</strong> A name attached to the act of deciding, not to the act of typing. "Approved" with no author is a fact with nobody standing behind it.</li><li><strong>The thing decided about.</strong> The drawing, the rate, the bill, the variation — in the version that was in front of the person at the moment they decided.</li><li><strong>Evidence it was communicated.</strong> A decision nobody was told about is indistinguishable, later, from a decision that was never made.</li></ul>
<p>Three out of four is not a partial answer. A dated approval by a named person against a document you can no longer identify is worth very little, and you will spend the meeting explaining why.</p>
<h2 id="the-four-things-that-destroy-a-defence">The four things that destroy a defence<a class="anchor" href="#the-four-things-that-destroy-a-defence" aria-label="Link to this section">#</a></h2>
<p>Every construction office has at least two of these.</p>
<p><strong>A spreadsheet with no history.</strong> It shows today's figures. It cannot show what it said on the date in question, who changed a cell, or whether a cell was changed at all. The other side does not have to prove it was altered. They only have to observe that it could have been, and the file stops being evidence and becomes an assertion. That is the argument for <a href="https://be-teck.com/blog/append-only-records/">records that are added to and never overwritten</a>.</p>
<p><strong>A message on a phone that no longer exists.</strong> The approval was given on WhatsApp. The handset was replaced, the chat was not backed up, the person has left. Or the chat survives and shows <em>haan, kar do</em> with no reference to which of the three pending items it answers. A message is a real communication and a poor record: no structure, and it lives on hardware you do not control.</p>
<p><strong>A document that exists in three versions.</strong> Revision A on the site engineer's laptop, revision B in the contractor's mail, revision C printed and signed in a file nobody can find. Nothing marks which one was signed. Every version is plausible and none is authoritative, so the version produced by whoever is better organised becomes the truth.</p>
<p><strong>A signature nobody can attribute.</strong> A scanned initial on the last page. It could have been placed by anyone with access to the scanner, and the page under it could have been swapped. The live question is not whether the mark is genuine but whether the document beneath it is the one that was signed, and <a href="https://be-teck.com/blog/tamper-evident-documents/">what makes a document tamper-evident</a> is a different discipline from collecting signatures.</p>
<h2 id="why-reconstruction-is-worse-than-a-gap">Why reconstruction is worse than a gap<a class="anchor" href="#why-reconstruction-is-worse-than-a-gap" aria-label="Link to this section">#</a></h2>
<p>When the query lands, the instinct is to make the file complete. Somebody drafts the missing minute, dates it back, gets it signed, and puts it where it should have been all along.</p>
<p>This converts an administrative weakness into a credibility problem, and those are not the same size.</p>
<p>A gap is ordinary. Records go missing, people leave, a period was chaotic. Every experienced reviewer has seen it and has a way of dealing with it.</p>
<p>A document contradicted by its own metadata, or by another file that survived, or by a person's memory under questioning, does something worse. It puts every other document you produce into doubt. You are no longer defending one decision. You are defending your records as a class, and you will lose that argument even where you were right on the merits.</p>
<p>Say the gap exists. Say what you do have around it — the payment that went out, the material that arrived, the mail that referred to the meeting. A consistent partial record supports an inference in your favour. A perfect record that appeared afterwards invites the opposite one.</p>
<h2 id="what-a-trail-costs-its-own-keeper">What a trail costs its own keeper<a class="anchor" href="#what-a-trail-costs-its-own-keeper" aria-label="Link to this section">#</a></h2>
<p>Our own audit trail is a hash chain. Each entry is bound to the one before it, so a row cannot be inserted afterwards without the verification failing.</p>
<p>That has a consequence we did not plan and have come to like. When we repair data by hand — a correction we authorised, for a reason we would defend — we cannot also write ourselves a tidy audit row explaining it. There is nowhere to put one that would not break the chain. So the repair is written up in a dated change log that people read, in words, instead.</p>
<p>A trail nobody can quietly add to is a trail that makes its own keeper accountable. It costs a little convenience, and that cost is the property.</p>
<h2 id="the-parts-you-can-fix-now">The parts you can fix now<a class="anchor" href="#the-parts-you-can-fix-now" aria-label="Link to this section">#</a></h2>
<p>You cannot build a paper trail for a query that has already arrived. You can build one for the queries that have not.</p>
<ul><li><strong>Fix the moment of capture.</strong> The record is made when the decision is made, by the person who made it — not summarised on Saturday by somebody else from memory.</li><li><strong>Make authorship unavoidable.</strong> If a field can be filled without recording who filled it, sooner or later it will be.</li><li><strong>Keep one authoritative copy.</strong> Not a canonical folder that people copy out of. A place where the version in force is the one you open.</li><li><strong>Keep the sending, not only the sent thing.</strong> The date an instruction or a demand went out is more often the disputed fact than its contents.</li><li><strong>Make money decisions attributable to two people.</strong> Above a threshold you set, <a href="https://be-teck.com/blog/two-signatures-on-money/">two signatures on money</a> answers "who authorised this" before anybody asks.</li></ul>
<p>Where any of this touches a filing, a certificate, a registration or a limitation period, the structure is general but the specifics are not, and they change. Verify the version in force with your own advisor rather than settling it from general reading.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Nobody will ask to see your system. They will ask you to substantiate one decision, made by one person, on one date. That needs a record created at the time, a named author, the document as it then stood, and evidence it was sent.</p>
<p>The four things that destroy it are a historyless spreadsheet, a message on a replaced phone, a document with three versions, and a signature nobody can attribute. Building <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a> into the ordinary working day is what turns that query into a lookup instead of a scramble.</p>]]></content:encoded></item>
<item><title>One project, many contractors, and the gaps between them</title><link>https://be-teck.com/blog/one-project-many-contractors/</link><guid isPermaLink="true">https://be-teck.com/blog/one-project-many-contractors/</guid><pubDate>Tue, 01 Sep 2026 22:15:00 +0530</pubDate><description>A project split across trades loses most of its time in the handovers between them, not inside any one of them. Where the boundary fails, and what fixes it.</description><category>builders</category><category>site</category><category>procurement</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A project of any size is built by agencies that do not work for each other. Civil, steel, plumbing, electrical, lifts, facade, finishes — separate contracts, separate supervisors, separate programmes, separate commercial interests. Each reports to you. None reports to another.</p>
<p>Almost every delay on such a project lives in the handover between two of them, and not inside either.</p>
<p>That is an uncomfortable thing to establish, because a delay in a handover has no owner. Ask the civil contractor and the front was ready. Ask the plumbing contractor and it was not. They are describing the same wall on the same day, and in each one's own records both are telling the truth.</p>
<h2 id="every-programme-is-right-and-the-set-is-wrong">Every programme is right and the set is wrong<a class="anchor" href="#every-programme-is-right-and-the-set-is-wrong" aria-label="Link to this section">#</a></h2>
<p>Each contractor prepares a programme. Each programme is internally consistent — sensible durations, correct sequence within that trade, resources that add up.</p>
<p>They are prepared separately, and each one contains assumptions about what the others will have done by a given date. Those assumptions are never written, because a contractor's programme is a description of his own kaam and not of yours. Put the programmes side by side and the assumptions contradict each other. Rarely by much. Usually by days, which is exactly the size that nobody escalates and everybody absorbs.</p>
<p>By month four the absorbed days are a month, and the discussion about whose month it is cannot be settled, because no document ever recorded who owed what to whom on which date.</p>
<h2 id="failures-of-sequence">Failures of sequence<a class="anchor" href="#failures-of-sequence" aria-label="Link to this section">#</a></h2>
<p><strong>The front that was not ready.</strong> The next trade mobilises, arrives, finds the area not handed over, and stands. He has a claim for idling and you have a week gone. Nobody told him to hold, because the person who knew the front was late and the person who called the trade forward are not the same person.</p>
<p><strong>The conduit that was not cast in.</strong> Electrical was to lay conduit before the pour. The pour happened. Now it is chased into finished concrete — slower, dearer, structurally unwelcome, and argued about for a month. The cost of the miss is many times the cost of the coordination that would have prevented it.</p>
<p><strong>Two trades in one space on one day.</strong> Both were scheduled correctly by their own planners. Neither knew of the other. One wins the space and the other goes home, and which one wins has nothing to do with which is on the critical path.</p>
<p><strong>A hold point nobody was told about.</strong> Work may not proceed past a stage until it is inspected — by your engineer, a consultant, an external party. The trade did not know, or knew and did not say, and the work is now covered. It is opened up, or accepted with a note. Both outcomes cost.</p>
<h2 id="failures-of-scope-and-material">Failures of scope and material<a class="anchor" href="#failures-of-scope-and-material" aria-label="Link to this section">#</a></h2>
<p><strong>Damage by the following trade.</strong> The floor was accepted, then a scaffold went up on it and gouged it. Who pays turns entirely on whether anybody recorded the condition at handover. Without that record it is one man's word against another's, and the man still on site when the defect surfaces is the one who pays.</p>
<p><strong>Material supplied by one, consumed by another.</strong> Ordinary on any job — the main contractor's cement used by the plastering agency, steel issued to a fabricator, shuttering lent across trades. If the issue is not recorded against a contract at the moment it leaves the store, it gets reconstructed at final bill from memory, and memory is generous in whichever direction is being asked.</p>
<p><strong>Scope each party believes is the other's.</strong> The small item between two packages — the sleeve, the puddle flange, the cutout, the last two metres of a service run. Each contract's wording lets its own reader conclude it is not his. It surfaces when the work is needed, at which point it is priced as an extra by whoever will do it.</p>
<h2 id="the-mechanisms-that-actually-help">The mechanisms that actually help<a class="anchor" href="#the-mechanisms-that-actually-help" aria-label="Link to this section">#</a></h2>
<p>None of these is clever. They are all about writing something down before it is contested.</p>
<p><strong>A written interface at each boundary.</strong> For every pair of trades that meets: who hands what to whom, in what condition, on what date. The condition carries as much weight as the date — "slab ready" and "slab ready, cleaned, levels checked, cutouts marked" are different obligations, and the difference is a week. This belongs in the contract document rather than a meeting, which is the same argument as <a href="https://be-teck.com/blog/work-order-or-purchase-order/">what a work order or purchase order has to establish</a>.</p>
<p><strong>Joint inspection at handover, with a record.</strong> The two supervisors walk the area together, and the outgoing trade's condition is recorded on the day it stops being his responsibility. Photographs, and a line both sign. This one habit removes most damage disputes, because it converts them from an argument about the past into a comparison of two records.</p>
<p><strong>One dated place where the sequence lives.</strong> Not each contractor's programme. One sequence held by you, which every trade reads, and which records when each handover actually happened against when it was due. The <a href="https://be-teck.com/blog/the-daily-progress-report/">daily progress report</a> is where the actual date comes from, if it is written to be read rather than filed.</p>
<p><strong>A route for the boundary problem itself.</strong> Interface issues stall because they belong to two people, and a thing that belongs to two people belongs to nobody — the general case of <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">why tasks stall between people</a>. Somebody has to be able to raise it early without it reading as a complaint about a colleague, and <a href="https://be-teck.com/blog/escalation-without-shame/">escalation without shame</a> is the condition that makes early raising possible at all.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Contractors deliver their own scope competently and drop the joints between them. The delay you cannot recover is the one that belonged to two people.</p>
<p>Write the interface down — who hands over what, in what condition, on what date. Inspect at every handover with both sides present and record the condition. Keep one dated sequence that shows when the handover actually happened, not when it was meant to.</p>]]></content:encoded></item>
<item><title>One builder, many companies, one set of records</title><link>https://be-teck.com/blog/one-builder-many-companies/</link><guid isPermaLink="true">https://be-teck.com/blog/one-builder-many-companies/</guid><pubDate>Tue, 01 Sep 2026 22:10:00 +0530</pubDate><description>A developer runs several legal entities for sound reasons. The cost is operational, and it lands on staff time, shared material and money between accounts.</description><category>builders</category><category>accounts</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A developer of any age is not one company.</p>
<p>There is usually a company per project. There is a contracting arm that builds for the project companies. There is an entity holding land, often older than the rest. There is a partnership left over from a joint development done years ago with a family who still hold a share. Occasionally there is a company that exists because a lender asked for it.</p>
<p>This is the ordinary shape of the business, and each entity is there for a reason.</p>
<ul><li><strong>Ring-fencing a project.</strong> A scheme's liabilities stay with the scheme. If one goes wrong the others are not dragged into it.</li><li><strong>Land arrangements.</strong> The landowner contributes land and takes a share. He will not put his land into a company that also carries somebody else's construction risk.</li><li><strong>Different partners per project.</strong> The investor in one tower is not the investor in the next. Separate entities let the economics stay separate.</li><li><strong>Lender requirements.</strong> A lender funding one project wants a borrower whose cash flows he can see, not commingled with four other schemes.</li></ul>
<p>Each of these is sound. Together they produce an operating problem nobody signs up for deliberately: the business is one organisation and the records are several, and the seams show everywhere.</p>
<h2 id="where-the-seams-leak">Where the seams leak<a class="anchor" href="#where-the-seams-leak" aria-label="Link to this section">#</a></h2>
<p><strong>Staff who work across entities.</strong> The site engineer covers two projects. The accountant covers all of them. The purchase manager buys for whoever is building. Salary sits on whichever entity was convenient at the time of joining, and time is booked nowhere at all. At year end somebody allocates by feel and calls it a policy.</p>
<p><strong>Material bought on one and consumed on another.</strong> A lorry of steel ordered by the entity with the credit line, unloaded at the site that needed it. The GRN is written at the receiving site, the invoice reaches the buying entity, and the two records sit in different books with no line joining them.</p>
<p><strong>One purchase order covering two projects.</strong> Cheaper per tonne, obviously. It is also a document that cannot be matched cleanly against either set of books, and <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a> breaks on it in the ordinary way — one order, several receivers, several ledgers.</p>
<p><strong>Inter-company balances nobody reconciles.</strong> Entity A has paid things for entity B for three years. A's books show a receivable, B's show a payable, and the two figures have never agreed. Nobody reconciles them because there is no counterparty pushing. Both sides are you, and neither side chases itself.</p>
<p><strong>One account paying another entity's vendor.</strong> The money was in the wrong place on the day, so the payment went from wherever it could. It records as an expense in the paying entity, and the correction, if it comes at all, comes months later as a journal nobody can trace back to the bank line. It makes <a href="https://be-teck.com/blog/matching-a-bank-line/">matching a bank line</a> impossible in exactly the case where matching would have told you something.</p>
<p><strong>One WhatsApp group for three legal persons.</strong> Approvals, rates and instructions spanning separate legal entities in a single thread, with no marker of which company any given message binds. When somebody later asks who agreed what on behalf of whom, the thread cannot answer, and the hisaab that follows is settled by whoever remembers it more confidently.</p>
<h2 id="the-discipline-that-holds">The discipline that holds<a class="anchor" href="#the-discipline-that-holds" aria-label="Link to this section">#</a></h2>
<p>Three habits. All cheap if adopted early and expensive if adopted late.</p>
<p><strong>The entity is a field on the transaction, not a folder it lives in.</strong> Every voucher, order, receipt, bill and payment carries the entity it belongs to as data, chosen at entry by the person who knows, and it cannot be left blank. If the entity is decided later by whoever is doing the books, then it was decided by convenience, and every report by entity is a report of somebody's convenience.</p>
<p>Once it is a field it composes with everything else. Entity plus project plus cost head answers the questions you actually get asked, which is part of why <a href="https://be-teck.com/blog/cost-heads-that-survive-a-project/">cost heads that survive a project</a> matter more than the chart of accounts does.</p>
<p><strong>A transfer between entities is documented as a transfer.</strong> Not as an expense in one and silence in the other. Two entries, one document, one reference, each side naming the other. If it is a loan, it says loan. If it is a supply, there is a supply document. If it is a reimbursement, the underlying cost is identified.</p>
<p>The test is plain: can somebody who was not present tell, from the record alone, why money moved between two companies you own? If the answer is "they would have to ask", it is not documented.</p>
<p><strong>Shared costs have a stated basis, decided in advance.</strong> Head office salary, a shared consultant, insurance covering several sites, a vehicle. Write down how it is split and why — area, value, headcount, whatever suits — and write it down before the period it describes, not during the review that questions it.</p>
<p>An allocation basis decided in advance and applied consistently is a policy. The same basis decided at year end is a result, and it reads like one to everybody who comes later.</p>
<h2 id="why-the-history-matters-more-here">Why the history matters more here<a class="anchor" href="#why-the-history-matters-more-here" aria-label="Link to this section">#</a></h2>
<p>With one company, an amended entry is an amended entry. With several, an amended entry may have moved a cost between two legal persons, and the question <em>when did this become entity B's cost, and who decided that?</em> has a real answer somebody may need.</p>
<p>Records that are added to rather than overwritten — <a href="https://be-teck.com/blog/append-only-records/">append-only records</a> — carry that answer at no extra cost. So does the habit behind <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>: holding not only the current state but the sequence that produced it, and the person who produced it.</p>
<p>How the structure should be set up, and the rules that govern dealings between related entities, are matters for your own advisors, and they change. Verify the version in force with them rather than settling it from general reading. What does not change is the operating point below the legal one: the structure is a fact of the business, and the records have to be kept in a way that survives it.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Several entities is the normal shape of an Indian developer, and each one exists for a reason. The cost is operational, and it lands on staff time, shared material, common orders and money moving between accounts.</p>
<p>Make the entity a required field at the point of entry. Document transfers as transfers, with both sides referring to each other. Fix the basis for shared costs before the period rather than after it.</p>]]></content:encoded></item>
<item><title>Cost heads that survive a project</title><link>https://be-teck.com/blog/cost-heads-that-survive-a-project/</link><guid isPermaLink="true">https://be-teck.com/blog/cost-heads-that-survive-a-project/</guid><pubDate>Tue, 01 Sep 2026 22:05:00 +0530</pubDate><description>A cost structure is designed for the budget and filled by the invoices. Why heads at the wrong grain fail, and what makes a coding structure last three years.</description><category>builders</category><category>money</category><category>accounts</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every builder sets up a cost coding structure on day one. By month eight most of them wish they had set up a different one.</p>
<p>The reason is structural rather than careless. The structure is designed for the budget. The budget is a forecast made before anything was known — before the contractor was appointed, before the soil report changed the raft, before the finishes were revised. The actuals then arrive in the shape the invoices happen to have, which is the shape of your vendors' businesses and not of your forecast.</p>
<p>So a structure built for one purpose is filled by data generated for another. The mismatch does not announce itself. It surfaces the first time somebody asks a question the coding cannot answer.</p>
<h2 id="the-grain-is-wrong">The grain is wrong<a class="anchor" href="#the-grain-is-wrong" aria-label="Link to this section">#</a></h2>
<p><strong>A head too coarse to be useful.</strong> "Civil works" as one head on a project that runs three years. Everything lands in it. The variance report says civil works is over budget, which you already knew, and cannot say whether it is labour, concrete, a rate revision or scope that was never in the budget at all. A head that cannot produce an action is a filing category, not a cost head.</p>
<p><strong>A head so fine that nobody codes it consistently.</strong> The opposite failure, and it is commoner in offices that were burned by the first one. Sixty heads where twelve would do. The person coding cannot hold the distinctions in mind, so he picks by resemblance, and the fine structure fills with noise. Precision that is not achievable at the point of entry is not precision.</p>
<p><strong>The same cost coded three ways.</strong> Shuttering hire booked to formwork by one person, to plant and machinery by another, to civil works by a third, each defensibly. Nobody is wrong. The structure permitted all three and never said which. Now no report on any of those three heads means anything, and the fault is invisible because every individual entry looks correct.</p>
<h2 id="the-structure-moves-under-you">The structure moves under you<a class="anchor" href="#the-structure-moves-under-you" aria-label="Link to this section">#</a></h2>
<p><strong>A head invented mid-project.</strong> Something genuinely new arrives — a dewatering cost, an item of scope nobody foresaw — and a head is created for it. Sensible in itself. But the budget has no such line, so the comparison for that head is against zero, and the head it would otherwise have come out of shows an underspend it did not earn. Two lines are now wrong and only one of them looks it.</p>
<p><strong>Renumbering.</strong> The quietest destruction available. Somebody reorganises the structure so it reads better. Every historical figure now sits under a code that means something else, and every comparison to last quarter is nonsense that still adds up correctly. This is the same disease that <a href="https://be-teck.com/blog/running-account-bills/">running account bills</a> suffer when item codes change midway: the arithmetic survives, the meaning does not.</p>
<p><strong>Coded to a project but not below it.</strong> Everything is tagged to the project. Nothing is tagged to a building, a tower, a wing or a floor. Then somebody asks what tower B cost — because tower B is sold to a different set of buyers, or funded by a different partner — and there is no answer that does not involve re-reading three years of invoices.</p>
<p><strong>Contingency as a dumping ground.</strong> Contingency is meant for identified risk that may or may not occur. It becomes the head for anything that does not obviously belong elsewhere, because coding to contingency ends an argument. By the time it is exhausted nobody can say what it went on, which means nobody can say whether the project was over budget or merely mis-coded.</p>
<p><strong>Overhead allocated with no stated basis.</strong> Head office cost is pushed onto projects by a method that lives in one person's spreadsheet. Change the method and the project's profitability changes without anything happening on site. If the basis is not written and not decided in advance, it will be questioned precisely when the number is inconvenient. Where several entities are involved the same problem sits one level up, in <a href="https://be-teck.com/blog/one-builder-many-companies/">one builder, many companies</a>.</p>
<h2 id="what-makes-a-structure-survive">What makes a structure survive<a class="anchor" href="#what-makes-a-structure-survive" aria-label="Link to this section">#</a></h2>
<p><strong>It is decided by the person who will answer questions from it.</strong> Not by the accountant alone, and not by a software vendor's default chart. If the project head is the one who will be asked why tower B is over, he should be the one choosing the heads, because he is the only person who knows which questions get asked.</p>
<p><strong>It is small enough to be remembered.</strong> The working test: can somebody coding an invoice list the plausible heads without opening a document? If he has to look it up, he will not, and he will use whichever head he remembers.</p>
<p><strong>It separates what varies with quantity from what does not.</strong> Material and subcontract value move with what is built. Site establishment, supervision, plant on hire and finance do not, or move differently. Mixing them makes every per-unit figure a lie, and per-unit figures are what you carry into <a href="https://be-teck.com/blog/quoting-a-rate-you-can-live-with/">quoting a rate you can live with</a> on the next job.</p>
<p><strong>It never renumbers mid-project.</strong> Add a head if you must. Retire one if you must, and leave it in place, closed. Never reuse a code, for the same reason a <a href="https://be-teck.com/blog/reading-a-bill-of-quantities/">bill of quantities</a> keeps its item numbers to the end.</p>
<p><strong>Coding happens once, at entry, by somebody who knows what the cost was for.</strong> Not later, by a person reading a description. The site engineer who raised the requirement knows what the material was for. The accounts assistant three weeks later knows only what the invoice says, and the invoice describes what the vendor sold, not what you used it on. This is also the moment when <a href="https://be-teck.com/blog/reconciling-a-vendor-bill/">reconciling a vendor bill</a> is cheapest, because the person who can answer the query is still nearby.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A cost structure is designed for the budget and filled by the invoices, and that mismatch is the whole problem. Keep it coarse enough to code consistently and fine enough to answer the questions you actually get, including the ones below project level.</p>
<p>Fix the basis for allocations in advance, keep contingency for identified risk only, code at entry, and never renumber. A structure that survives a project is worth far more than one that was elegant at the start of it.</p>]]></content:encoded></item>
<item><title>Two payment ladders that never line up</title><link>https://be-teck.com/blog/two-payment-ladders/</link><guid isPermaLink="true">https://be-teck.com/blog/two-payment-ladders/</guid><pubDate>Tue, 01 Sep 2026 22:00:00 +0530</pubDate><description>Buyers pay on certified stages, contractors on measured quantity, and the space between the two schedules is what a developer's working capital actually is.</description><category>builders</category><category>money</category><category>sales</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A developer collects on one ladder and pays on another.</p>
<p>The collection ladder is written into the buyer's agreement: something on booking, something on agreement, something on each slab, something on possession. The payment ladder is written into the construction contracts: running account bills against measured work, advances against material, retention released at defined points.</p>
<p>The two ladders describe the same building. They are connected by physics — the slab that triggers a demand is the slab the contractor was paid to cast — and by nothing else. Different documents, different counterparties, different triggers, different timing.</p>
<p>The space between them, month by month, is what a developer's working capital actually is. Not a financing line. The arithmetic of two schedules that were never designed to meet.</p>
<h2 id="why-they-cannot-line-up">Why they cannot line up<a class="anchor" href="#why-they-cannot-line-up" aria-label="Link to this section">#</a></h2>
<p><strong>Different measuring instruments.</strong> Buyers pay on a stage that somebody certifies as reached. Contractors bill on quantity that somebody measures. A stage is a discrete event; measured quantity is continuous. The contractor's bill for the month covers work spread across a stage boundary, and the buyer's demand covers a boundary the bill knows nothing about. The two documents describe the same concrete and cannot be reconciled line to line. That is normal, and worth saying out loud so nobody spends a month trying.</p>
<p><strong>One event, many payers.</strong> A slab is cast once. It triggers a demand to every buyer in that tower, and each of them pays on his own schedule — some on the day, some after a reminder, some after a second reminder, some when their loan is disbursed, some not at all. One certain outflow has been matched against many uncertain inflows, and the distribution of those inflows decides whether the month is comfortable.</p>
<p><strong>A defaulting buyer does not pause the contractor.</strong> The contractor's entitlement arises from work done. It does not care who has paid. Every collection problem on the sales side lands, unchanged in size, on the construction side, and the developer absorbs the whole of it.</p>
<p><strong>Material is paid for before its stage is reached.</strong> Steel and cement for a slab are bought before the slab exists, sometimes months before, because rates were good or supply was tight or the contractor needed mobilisation. The money leaves on the material's schedule and returns on the stage's, and that gap is real cash. Whether the material has actually arrived when the money leaves is a separate discipline — <a href="https://be-teck.com/blog/money-before-material/">money before material</a> — and the gap is where a timing problem quietly becomes a loss.</p>
<p><strong>Retention is money you hold that the buyer has already paid.</strong> You have deducted retention from the contractor. The buyer paid for the completed stage in full. So a balance sits with you which belongs to somebody, will be released later, and is not profit. It is the easiest money on a project to spend by mistake, because nothing about it looks restricted. The mechanics are in <a href="https://be-teck.com/blog/retention-money/">retention money</a>; the point here is that any comparison of the two ladders which ignores it is flattering.</p>
<p><strong>A stage completed just after a month-end.</strong> The slab is cast on the first of the month rather than the last of the previous one. Nothing has changed about the project. Everything has changed about the month — the demand goes out in the next cycle, collections land a month later, and the contractor's bill for the earlier month is already payable. Two ordinary days move a month's cash.</p>
<h2 id="what-to-do-about-it">What to do about it<a class="anchor" href="#what-to-do-about-it" aria-label="Link to this section">#</a></h2>
<p>You cannot make the ladders meet. You can stop treating them as one thing.</p>
<p><strong>Model them as two schedules with a stated linkage.</strong> One schedule of expected collections by stage and by buyer. One of expected certifications and payments by contract. Then, written down, the linkage: which construction event triggers which demand stage, and by what definition. If that mapping lives only in the sales head's memory, the two ladders are connected by a person, and he will be on leave in the month it matters.</p>
<p><strong>Publish the demand on the day the stage is certified.</strong> Not when somebody in accounts gets to it. The certification date is the earliest legitimate date; every day after it is financing you have donated, and the delay is almost always administrative rather than deliberate. Drafting the notice properly is its own subject — <a href="https://be-teck.com/blog/the-demand-letter/">the demand letter</a> — and is separate from the scheduling discipline of sending it on time.</p>
<p><strong>Keep the deductions visible on both sides.</strong> Retention, advance recovery and set-off on the contractor side behave like part-payments and holds on the collection side: balances with a future, not reductions in value. Collapsing them into one net figure destroys the information, which is the argument <a href="https://be-teck.com/blog/running-account-bills/">running account bills</a> make about certificates and which applies just as well to a collection statement.</p>
<p><strong>Keep money and progress as separate facts.</strong> Cash collected is not work done, and work done is not revenue. Which is recognised when, and on what basis, is a matter for your auditor and the standards in force — verify that with them rather than from general reading. The operating point stands on its own: <a href="https://be-teck.com/blog/staged-payments-and-accounting/">staged payments and accounting</a> treat a stage as several distinct events, and a business that conflates them cannot tell a collection problem from a construction one.</p>
<p><strong>Never report collections as progress.</strong> It is the most tempting number in a developer's office, because it is the easiest to produce and it moves. A good collection month against a bad construction month is a business getting worse and looking better. The reverse is a business getting better and looking worse. Report the two side by side, always, and never let either stand in for the other.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Buyers pay on certified stages. Contractors are paid on measured quantity. The two ladders are joined by the building and by nothing in the paperwork, and the space between them is your working capital.</p>
<p>Model both as schedules, write down which construction event triggers which demand, raise the demand on the day of certification, and keep collections and progress as two numbers that are never allowed to substitute for one another.</p>]]></content:encoded></item>
<item><title>Leads that die in an Excel sheet</title><link>https://be-teck.com/blog/leads-that-die-in-excel/</link><guid isPermaLink="true">https://be-teck.com/blog/leads-that-die-in-excel/</guid><pubDate>Tue, 01 Sep 2026 21:50:00 +0530</pubDate><description>Every project starts with a sales sheet, and it fails for mechanical reasons — no history, no two people at once, and a date in a cell that never rings.</description><category>crm</category><category>sales</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The first sales record on any project is a spreadsheet. Somebody opens a file, types Name, Number, Project, Status, and the sales operation exists.</p>
<p>That is the correct first move. The sheet costs nothing, needs no training, and is running before the hoarding goes up. Nobody should apologise for it.</p>
<p>It stops working for reasons that have nothing to do with discipline. The failures are mechanical. Naming them exactly is the useful exercise, because "we should move off Excel" is not an argument anybody acts on, while "the status on this row changed last week and nobody knows who changed it" is.</p>
<h2 id="the-failures-named">The failures, named<a class="anchor" href="#the-failures-named" aria-label="Link to this section">#</a></h2>
<p><strong>One file, several people.</strong> There are only two arrangements and both are bad. Either the file lives on one laptop, in which case the sales team queues at one desk and the person who owns the laptop owns the truth. Or it is shared, and within a fortnight there are four copies with suffixes, each holding some updates the others do not, and no way to combine them except by reading both side by side.</p>
<p><strong>No history.</strong> A lead moves from Hot to Cold. The cell now says Cold. It does not say who decided that, on what date, or after which conversation. The previous value is gone. Six weeks later the manager asks why a good enquiry was dropped, and the honest answer is that the sheet cannot tell anyone.</p>
<p><strong>A sort that took the range and not the row.</strong> Somebody selects the status column, sorts it, and the statuses reorder while the names and numbers stay put. Every row in the file is now wrong, quietly and permanently. There is no error message and no undo an hour later.</p>
<p><strong>A filter left on.</strong> The last person filtered to one project and closed the file. The next person opens it and sees a subset which looks like the whole. Leads that exist, that were paid for, are invisible to the person whose job is to call them.</p>
<p><strong>The lead entered at the bottom, or not at all.</strong> A sheet is unusable on a phone. So the caller at a hoarding or a mall kiosk writes the number on paper, or sends it to their own WhatsApp, and enters it in the evening. Some evenings that does not happen. The enquiry the marketing budget bought never reaches the file.</p>
<p><strong>The same buyer entered twice.</strong> Two callers, two rows, two owners, and one irritated buyer receiving the same pitch twice. A sheet has no way to warn anybody, and the duplicate is usually found at booking, which is the worst possible moment. The mechanics of that case are their own subject — <a href="https://be-teck.com/blog/one-buyer-three-enquiries/">one buyer, three enquiries</a>.</p>
<p><strong>A date in a cell does not ring.</strong> This is the one that costs the most money. The sheet can hold <em>follow up on the fourteenth</em> perfectly well. It simply never mentions it again. The date is a fact, not an instruction, and a fact sitting in a cell has never called anybody.</p>
<p><strong>The month-end rewrite.</strong> Before the review, the sheet is tidied. Stale rows are deleted, statuses are moved to match what was reported, the count is made to agree with the count that was announced. The file that survives is a report, not a record, and the following month starts from it.</p>
<h2 id="why-the-sheet-survives-anyway">Why the sheet survives anyway<a class="anchor" href="#why-the-sheet-survives-anyway" aria-label="Link to this section">#</a></h2>
<p>Because it is genuinely good at three things, and anyone proposing a replacement is competing with all three at once.</p>
<ul><li><strong>It is instantly editable.</strong> A new column costs three seconds and no permission. When a new tower launches and somebody wants to track floor preference, it is tracked that afternoon.</li><li><strong>Everybody can read it.</strong> No training, no login, no explanation. A manager who has never seen the file can understand it in a minute.</li><li><strong>It costs nothing and asks nobody.</strong> No approval, no procurement, no vendor.</li></ul>
<p>Any replacement is measured against these three whether or not the person comparing says so out loud. A system where adding a field means raising a request and waiting a week will lose to the sheet, no matter what else it does, because the sheet will reappear on somebody's desktop the first time the system says no. This is one of the places where the shipped <a href="https://be-teck.com/blog/defaults-are-decisions/">defaults are decisions</a> — what the software makes easy on day one is what the office will actually do.</p>
<h2 id="what-a-sheet-structurally-cannot-do">What a sheet structurally cannot do<a class="anchor" href="#what-a-sheet-structurally-cannot-do" aria-label="Link to this section">#</a></h2>
<p>Three things. Not does badly — cannot, because of what a spreadsheet is.</p>
<p><strong>Hold history.</strong> A cell holds one value: the current one. Every change is a destruction of the previous state. A sales record needs the opposite property, where new information is added and nothing is overwritten, which is the whole argument for <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>.</p>
<p><strong>Be read and written by two people at once.</strong> Not "shared" — genuinely concurrent, with both people's work surviving. Two callers working the same list at the same hour is the ordinary case in a sales office, not an edge case.</p>
<p><strong>Act on a date by itself.</strong> A record that knows a follow-up was due yesterday and says so, unprompted, to the person who owes it. Everything a sales team does is a sequence of dated promises, and a system that cannot act on a date is just a filing cabinet with better arithmetic. What that looks like when built properly is <a href="https://be-teck.com/blog/follow-up-is-a-schedule/">follow-up as a schedule</a>.</p>
<p>Those three are the entire brief. A lead system that holds history, takes two people at once, and acts on dates by itself has earned its place. One that does those three and is also slower to edit than a sheet has still won, because the three are not conveniences.</p>
<h2 id="before-you-replace-it">Before you replace it<a class="anchor" href="#before-you-replace-it" aria-label="Link to this section">#</a></h2>
<p>Take last quarter's sheet and try to answer three questions from it alone. Who changed this lead's status, and when? Which follow-ups were due last week and not made? Which of these rows are the same person?</p>
<p>If the file cannot answer them, that is not a failure of the person who kept it. It is a description of what the tool is. The next tool should be chosen by whether it answers those three, and by whether the caller standing at a kiosk can enter a name into it in ten seconds. Both, or neither will be used. The field-by-field version of that requirement is <a href="https://be-teck.com/blog/what-a-lead-record-should-hold/">what a lead record should hold</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The sales sheet is not a bad decision, it is a tool with three structural limits: no history, no concurrency, and no ability to act on a date.</p>
<p>It survives because it is instant, readable and free, and any replacement must match all three or it will be quietly abandoned.</p>
<p>Judge the replacement by whether it can say who changed a status and when, which follow-ups are overdue, and which rows are the same buyer.</p>]]></content:encoded></item>
<item><title>Working with brokers without a fight at payout</title><link>https://be-teck.com/blog/working-with-brokers/</link><guid isPermaLink="true">https://be-teck.com/blog/working-with-brokers/</guid><pubDate>Tue, 01 Sep 2026 21:45:00 +0530</pubDate><description>The dispute with a channel partner is almost never about the rate. It is about who brought the buyer, and about when the money is due to be paid.</description><category>crm</category><category>sales</category><category>money</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Ask a sales head what goes wrong with channel partners and you will be told about rates. Ask the accounts desk that actually pays them and you get a different answer.</p>
<p>The rate is agreed early, in writing, usually in one line, and both sides remember it. Almost nothing is ever disputed about the rate.</p>
<p>The fights are about two other things. Who brought this buyer. And when, exactly, does the money become payable. Both are questions the arrangement should have answered before the season started, and usually did not.</p>
<h2 id="where-attribution-breaks">Where attribution breaks<a class="anchor" href="#where-attribution-breaks" aria-label="Link to this section">#</a></h2>
<p><strong>Two brokers claim the same buyer.</strong> The commonest case and the hardest. One sent the enquiry on WhatsApp a month ago; the other walked the buyer into the site office on Sunday. Both are telling the truth about what they did. Without a rule decided in advance, this becomes a negotiation between two firms you need next quarter, settled by whoever argues harder.</p>
<p><strong>The buyer comes back direct.</strong> A broker showed him the project. He went away, thought about it, and returned on his own — or through the portal, or through your own tele-caller ringing an old enquiry. The broker's work is real and invisible. Your team's work is real and documented. Nothing about the record resolves this on its own, and if the two approaches were captured as two separate rows you have a duplicate to untangle as well as a claim to settle, which is <a href="https://be-teck.com/blog/one-buyer-three-enquiries/">one buyer, three enquiries</a>.</p>
<p><strong>A tagging window nobody wrote down.</strong> Most offices operate some version of "a registered client stays with that broker for a while". How long is a while varies by whoever is asked, and is discovered only when it matters.</p>
<p><strong>The junior who is not the firm.</strong> A large channel partner's associate brings the client. He is not the empanelled firm, or he has moved to another firm since, or he works with two. The payout is due to a name on an agreement; the work was done by a person; and the person expects to be paid.</p>
<p><strong>The record was made after the fact.</strong> The registration is emailed on Monday for a client shown on Saturday, or entered by your own executive from memory at month end. An attribution record written after the outcome is known is not evidence of anything, which is why the date on it has to be the date it was created and not a date somebody typed. The same discipline that makes any record trustworthy applies here — <a href="https://be-teck.com/blog/append-only-records/">append-only records</a> exist for precisely this class of dispute.</p>
<p>Underneath all of these is the same question your own team argues about internally, which is <a href="https://be-teck.com/blog/who-owns-the-lead/">who owns the lead</a>. A broker claim is an ownership claim from outside the payroll, and an office that has not settled ownership internally will not settle it with an outsider.</p>
<h2 id="where-timing-breaks">Where timing breaks<a class="anchor" href="#where-timing-breaks" aria-label="Link to this section">#</a></h2>
<p><strong>The booking cancels after the payout is made.</strong> Money has left. Now it must come back from a firm that has already distributed it to the person who did the work. Recovery of a paid brokerage is one of the least pleasant conversations in the business, and it is entirely avoidable by paying later.</p>
<p><strong>The payout is tied to a milestone the broker cannot see.</strong> Registration done, or a stage payment received, or agreement executed. All reasonable triggers. But the broker has no way to know whether the trigger has occurred, so he rings the sales manager, who rings the CRM desk, who checks. Three people's time, per call, per broker, for a fact that already exists in your records.</p>
<p><strong>"It is in process."</strong> The broker asks. Nobody wants to say a number, so he is told it is in process. He is told the same thing the next time. What was a payment question becomes a trust question, and the next enquiry he generates goes to a competitor who pays predictably rather than generously.</p>
<p><strong>A short payment with no reason attached.</strong> A deduction is made — for a discount he agreed to, for tax withheld, for an earlier cancellation — and the remittance carries no explanation. The broker sees only that less arrived than was promised, which is exactly the situation described in <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a>: the deduction may be entirely correct, and it still reads as a broken promise unless it says why.</p>
<h2 id="what-a-workable-arrangement-contains">What a workable arrangement contains<a class="anchor" href="#what-a-workable-arrangement-contains" aria-label="Link to this section">#</a></h2>
<p>Four things, all decided before the launch rather than during the first argument.</p>
<ul><li><strong>A written attribution rule.</strong> Not a principle — a rule with an order of precedence, covering the direct-return case and the two-claim case explicitly. It will be unfair to somebody in some case. A rule that is known in advance and slightly unfair beats a fair decision made after the fact.</li><li><strong>A dated registration with an expiry.</strong> The client is registered to the broker on a date, and that claim lapses on a date. Both dates visible to both sides. An expiry is what stops a broker registering the whole city and waiting.</li><li><strong>One visible status.</strong> A single line per case that can be read out or sent without anybody investigating: registered, visited, booked, agreement done, payout due on the next receipt. The purpose is to end the ringing.</li><li><strong>A payout schedule tied to money received.</strong> Not to booking. Brokerage released in step with the buyer's own instalments behaves like every other staged obligation in the business, and the reasoning is the same as in <a href="https://be-teck.com/blog/staged-payments-and-accounting/">staged payments and accounting</a> — the promise is made once, the money moves in parts, and the record has to hold both.</li></ul>
<h2 id="one-office-habit-worth-more-than-the-rules">One office habit worth more than the rules<a class="anchor" href="#one-office-habit-worth-more-than-the-rules" aria-label="Link to this section">#</a></h2>
<p>The person who confirms attribution should not be the person whose target it counts against.</p>
<p>A sales manager deciding whether a walk-in "really" came through a broker is deciding whether the sale counts as his team's or as channel. He may be scrupulous. He is still being asked to rule on his own number, every time, at speed, in front of the broker.</p>
<p>Move that decision one desk away — to CRM, to the person who does post-booking paperwork, to anyone whose incentive does not move with the answer. The rule you wrote is only as good as the independence of whoever applies it, and this costs nothing to arrange on day one and is nearly impossible to introduce later without it looking like an accusation.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Channel partner disputes are about attribution and timing, not rate.</p>
<p>Decide the attribution rule in writing before the season, register clients with a date and an expiry, and let the broker read one status without ringing anybody.</p>
<p>Pay against money actually received rather than against booking, explain every deduction on the remittance, and put the attribution decision with somebody whose own number does not depend on the answer.</p>]]></content:encoded></item>
<item><title>What a lead record should actually hold</title><link>https://be-teck.com/blog/what-a-lead-record-should-hold/</link><guid isPermaLink="true">https://be-teck.com/blog/what-a-lead-record-should-hold/</guid><pubDate>Tue, 01 Sep 2026 21:40:00 +0530</pubDate><description>Field by field, what belongs on an enquiry record in a primary sales office, what does not, and the one test that settles every argument about a new field.</description><category>crm</category><category>sales</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every sales office argues about fields. Somebody wants profession added, somebody wants a rating out of five, somebody wants the wife's name because it helps at closing.</p>
<p>The arguments never resolve, because they are being had in the wrong terms — as a debate about what would be nice to know rather than about what will be filled in and acted upon.</p>
<p>There is a single test that settles them. For any proposed field: <strong>who reads it, and what do they do differently because of it?</strong> If neither half has an answer, the field is decoration, and decoration is not free — it makes the form longer, which makes capture slower, which means fewer enquiries get captured at all.</p>
<h2 id="identity-the-fields-that-let-you-find-the-duplicate-later">Identity: the fields that let you find the duplicate later<a class="anchor" href="#identity-the-fields-that-let-you-find-the-duplicate-later" aria-label="Link to this section">#</a></h2>
<p>The point of the identity fields is not to address the buyer politely. It is so that when the same person appears again through another channel, the system can recognise him.</p>
<p><strong>The phone number is the spine.</strong> It is the only field in this market that is close to unique, close to stable, and always given. It should be stored in one normalised form — country code handled the same way every time, no spaces, no hyphens, no brackets — because a number stored two ways is two people as far as any comparison is concerned.</p>
<p><strong>The name is a weak key.</strong> The same buyer appears as a full name on one record, an initial and a surname on the second, the same name with <em>ji</em> attached on the third, and a spelling the caller heard over a bad line on the fourth. Regional spellings vary and initials expand and contract. Keep the name, display it, never match on it alone.</p>
<p><strong>Email is weaker still.</strong> Many buyers give none, or give one they never read, or give the family address that already sits on the son's enquiry. Store it. Do not build anything on it.</p>
<p><strong>Alternate numbers deserve their own place</strong>, not a note in a remarks box. The spouse's number, the son's number, the office landline. These are the numbers that later cause a "new" enquiry that is not new — the whole mechanism is in <a href="https://be-teck.com/blog/one-buyer-three-enquiries/">one buyer, three enquiries</a>.</p>
<h2 id="source-recorded-once-and-never-overwritten">Source, recorded once and never overwritten<a class="anchor" href="#source-recorded-once-and-never-overwritten" aria-label="Link to this section">#</a></h2>
<p>Source is where this enquiry came from: which portal, which hoarding number, which campaign, which broker, which walk-in.</p>
<p>The rule that makes it worth anything is that it is written at capture and never changed by a later touch. If the buyer later fills a form on the website, the record should gain a second touch — not replace its original source with the website. Every marketing decision you make afterwards depends on that first value being the truth about where the enquiry originated.</p>
<p>Systems get this wrong by design more often than by accident: last-touch overwriting is the easy thing to build, and it makes whichever channel calls last look like the channel that works. What the software does by default is what the numbers will say a year later, which is the argument in <a href="https://be-teck.com/blog/defaults-are-decisions/">defaults are decisions</a>.</p>
<h2 id="requirement-and-budget">Requirement and budget<a class="anchor" href="#requirement-and-budget" aria-label="Link to this section">#</a></h2>
<p><strong>Requirement, in the words the buyer used.</strong> Two BHK, park facing, ground floor because the mother cannot climb stairs. A dropdown with 2BHK / 3BHK flattens that into a category and destroys the part that closes the sale. Keep a structured configuration field for counting, and keep the buyer's own sentence beside it. Both. They do different jobs.</p>
<p><strong>Budget as a range, with the date it was said.</strong> Nobody has one number, and whatever was said in March is not what is true in September after he has seen four other projects. A budget with no date attached is treated as current forever, and the caller works from a figure that expired months ago.</p>
<p>Neither field should be mandatory at capture. A tele-caller with a moment of a stranger's attention gets a name, a number and a project. Requiring the budget before the record can be saved does not produce budgets — it produces records that never get saved, or a column of the same placeholder figure.</p>
<h2 id="stage-next-action-history">Stage, next action, history<a class="anchor" href="#stage-next-action-history" aria-label="Link to this section">#</a></h2>
<p>These three carry the whole system.</p>
<p><strong>Stage, defined in words.</strong> Not a colour, not Hot / Warm / Cold. Each stage needs a written definition that two different people would apply identically: what has happened for a lead to be in it, and what must happen for it to leave. "Warm" means whatever the person typing it felt that afternoon. "Visit done, objection not yet answered" means something a manager can act on.</p>
<p><strong>The next action, with a date and an owner.</strong> This is the most valuable field on the record and the one most often empty. Three parts, all required: what will be done, on what date, by which named person. Not a team, a person. A next action with no date is a wish, and a date with no owner belongs to nobody. The reason to insist on all three is that this is the only field a system can act on by itself, which is the subject of <a href="https://be-teck.com/blog/follow-up-is-a-schedule/">follow-up as a schedule</a>.</p>
<p><strong>History, which is every previous next action and what came of it.</strong> Not a remarks box that people append to until it is unreadable. Each completed action keeps its date, its owner, what was promised and what actually happened. This is what makes the record readable by somebody who has never spoken to the buyer — the manager on Monday, the replacement when the executive leaves, the CRM desk after booking.</p>
<h2 id="what-not-to-put-in">What not to put in<a class="anchor" href="#what-not-to-put-in" aria-label="Link to this section">#</a></h2>
<p><strong>Fields nobody will fill.</strong> Every optional field that stays empty teaches the team that empty is acceptable, and that lesson spreads to the fields that matter.</p>
<p><strong>A score computed from fields nobody filled.</strong> A rating out of a hundred derived from budget, timeline and profession, where two of the three are blank for most records, is arithmetic performed on absence. It looks authoritative on a dashboard and it is noise. Worse, people will start working the score instead of the record.</p>
<p><strong>Free text where a date belongs.</strong> "Will call next week" in a remarks column cannot be sorted, cannot be counted and cannot ring. This is the single habit that carries the spreadsheet's central weakness into the new system — <a href="https://be-teck.com/blog/leads-that-die-in-excel/">leads that die in an Excel sheet</a> is mostly a description of that one failure repeated in different forms.</p>
<p><strong>Anything copied from another record.</strong> The project's price list does not belong on the lead; copies go stale and callers quote them.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The identity fields exist to catch the duplicate, so the phone number is the spine and everything else is a weak key.</p>
<p>Source is written at capture and never overwritten. Requirement keeps the buyer's own words alongside the structured value. Budget is a range with a date.</p>
<p>Stage needs a written definition, the next action needs a date and a named owner, and the history needs to hold every previous one. And for each new field somebody proposes: who reads it, and what changes because of it.</p>]]></content:encoded></item>
<item><title>Who owns the lead</title><link>https://be-teck.com/blog/who-owns-the-lead/</link><guid isPermaLink="true">https://be-teck.com/blog/who-owns-the-lead/</guid><pubDate>Tue, 01 Sep 2026 21:35:00 +0530</pubDate><description>An enquiry with no named owner is not a lead. The assignment rules have to be written before the first dispute, because moving a lead moves money.</description><category>crm</category><category>sales</category><category>how-we-work</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>An enquiry that belongs to nobody in particular is not a lead. It is a phone number in a file.</p>
<p>Every other question about a sales process — follow-up discipline, conversion counting, why a good enquiry went cold — resolves back to this one. If you cannot name the single person responsible for an enquiry at any given moment, nothing downstream of it can be measured or corrected.</p>
<h2 id="the-rules-that-have-to-exist-before-they-are-needed">The rules that have to exist before they are needed<a class="anchor" href="#the-rules-that-have-to-exist-before-they-are-needed" aria-label="Link to this section">#</a></h2>
<p>There are five, and each one will be argued about eventually. The only real choice is whether they are decided in advance and written down, or invented during the argument, in front of the people affected.</p>
<ul><li><strong>How a new enquiry is assigned.</strong> Round robin across the team, by source, by project, by the language the buyer speaks, or by who is on shift. All of these are defensible. Round robin is the fairest and ignores fit. Assignment by language or by project is better for the buyer and produces uneven workloads that then need managing. Pick one, say why, and write it down.</li><li><strong>What happens when the owner is on leave.</strong> Enquiries do not pause for chhutti. Either the lead moves and comes back, or a cover person acts on it while ownership stays put. Both work. What does not work is nothing, which is what happens by default, and the buyer who called on a Tuesday hears from nobody until the following week.</li><li><strong>When ownership lapses.</strong> If nothing has been done on an enquiry for a defined period, it should return to the pool and become available. Without this rule, ownership is permanent and hoarding is free.</li><li><strong>What happens to a lead that returns after a year.</strong> The old owner may have left, changed projects or forgotten the buyer entirely. Is it a new enquiry or a revival of the old one? This must be decided once. The record should keep both histories either way.</li><li><strong>Who decides a transfer.</strong> Not the two people involved. A named role, with the decision recorded. Transfers agreed privately between executives are the ones that produce a claim at booking, from a third person who was never told.</li></ul>
<h2 id="why-this-is-not-an-administrative-matter">Why this is not an administrative matter<a class="anchor" href="#why-this-is-not-an-administrative-matter" aria-label="Link to this section">#</a></h2>
<p>Ownership is compensation. That is the whole reason these questions are hard.</p>
<p>A rule that moves a lead moves money, from a named person to another named person, in an office where everyone knows both. This is why arguments about assignment are more heated than arguments about anything else in a sales office, and why they cannot be settled by whoever is senior in the room on the day.</p>
<p>It also means the rules must be published before the first dispute rather than after. A lapse rule introduced the week after a large booking looks like a decision about that booking, whatever the intention. The same rule announced at launch, when nobody knows who it will affect, is just a rule. This is one specific case of the general principle in <a href="https://be-teck.com/blog/who-is-allowed-to-decide/">who is allowed to decide</a>: the authority for a decision has to be settled before the decision is contentious.</p>
<h2 id="the-failure-modes">The failure modes<a class="anchor" href="#the-failure-modes" aria-label="Link to this section">#</a></h2>
<p><strong>Assigned to a team.</strong> The enquiry sits with "the Sunday team" or "site office". Every member sees it, each assumes another has called, none has. This is the ordinary way work dies between people, and the mechanism is exactly the one described in <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">why tasks stall between people</a> — responsibility that is shared is responsibility that is unheld.</p>
<p><strong>Two owners.</strong> Usually the result of a transfer done in one place and not the other, or of a duplicate record. The buyer receives two calls with two versions of the price, and finds out that the office does not talk to itself.</p>
<p><strong>An owner who has left.</strong> Nobody removes departed staff from assignments, and a portion of the pipeline is now assigned to a person who does not come to work. These leads receive no calls and appear in no queue, because a queue is usually built per active user.</p>
<p><strong>Silent reassignment.</strong> The manager moves a lead without telling the previous owner. He finds out when the booking is announced. Whatever the merits of the move, the cost is paid in trust and collected for years.</p>
<p><strong>Hoarding.</strong> An executive holds a stack of enquiries he has not called in weeks, because holding them costs nothing and releasing them means somebody else might convert one. This is the direct consequence of no lapse rule, and it is a rational response to the incentives, not a character defect.</p>
<h2 id="making-a-lapse-rule-that-people-accept">Making a lapse rule that people accept<a class="anchor" href="#making-a-lapse-rule-that-people-accept" aria-label="Link to this section">#</a></h2>
<p>A lapse rule is the one that decides whether the whole arrangement is seen as fair, because it is the one that takes something away. Three properties make the difference.</p>
<p><strong>A visible countdown.</strong> The owner can see, on the record, how long he has before it lapses. Not a policy in a circular — a number on the screen he is already looking at. A lapse somebody can see coming is usually a lapse that does not happen.</p>
<p><strong>A warning before the event, to the owner and to nobody else.</strong> A private nudge first. If the lapse rule's first announcement is public, it functions as a reprimand, and people will start making a token call on every stale lead to reset the clock. What you get then is worse than hoarding: activity performed for the counter. Warnings work when they are early, quiet and addressed to the person who can still act, which is the design argument in <a href="https://be-teck.com/blog/escalation-without-shame/">escalation without shame</a>.</p>
<p><strong>A record of who took it, and when.</strong> When a lapsed lead is picked up, the transfer is written with a date and a name. If that lead books, the history shows exactly when ownership changed and under which rule, and the commission conversation is a reading exercise instead of an argument.</p>
<p>None of this works unless something in the system is actually watching dates and acting on them without being asked, which is the machinery described in <a href="https://be-teck.com/blog/follow-up-is-a-schedule/">follow-up as a schedule</a>. A lapse rule enforced by a manager remembering to check is not a rule.</p>
<p>The same questions arrive from outside the payroll when a channel partner claims a buyer. The vocabulary changes and the structure does not — <a href="https://be-teck.com/blog/working-with-brokers/">working with brokers</a> is the external half of this problem.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Name one person per enquiry, always. A lead owned by a team is owned by nobody.</p>
<p>Decide assignment, leave cover, lapse, revival and transfer authority in writing before the first dispute, because after it any rule looks like a verdict.</p>
<p>Make lapses visible in advance, warn privately, and record every change of owner with a date and a name.</p>]]></content:encoded></item>
<item><title>One buyer, three enquiries, three salespeople</title><link>https://be-teck.com/blog/one-buyer-three-enquiries/</link><guid isPermaLink="true">https://be-teck.com/blog/one-buyer-three-enquiries/</guid><pubDate>Tue, 01 Sep 2026 21:30:00 +0530</pubDate><description>The same person arrives through a portal, a hoarding number and a broker. Exact matching will not catch it, and a merge is an ownership decision.</description><category>crm</category><category>sales</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A man is looking for a flat. On Monday he fills the form on a property portal. On Wednesday he passes the site and rings the number on the hoarding. On Sunday his broker brings him for a visit.</p>
<p>Three records. Three owners. Three people who will ring him this week with the same pitch, and at least two of whom will believe they are talking to a fresh enquiry.</p>
<p>The buyer's experience of your organisation is now settled, and it is that the left hand does not know what the right is doing. If he books, there is a commission argument waiting. If he does not, three executives will each report a lost lead, and your enquiry count for the month is wrong by two.</p>
<h2 id="why-exact-matching-fails-in-this-market">Why exact matching fails in this market<a class="anchor" href="#why-exact-matching-fails-in-this-market" aria-label="Link to this section">#</a></h2>
<p>Every system ships with duplicate detection that compares two phone numbers for equality. It catches almost nothing, for reasons that are entirely ordinary.</p>
<p><strong>The country code.</strong> The portal delivers the number with a code prefixed. The tele-caller types the ten digits she was told. The broker's registration email has it written a third way. Three strings, one phone.</p>
<p><strong>Spaces, hyphens and brackets.</strong> A number typed with a space in the middle, or split with a hyphen because that is how the buyer said it, is a different string to a computer and the same number to a person.</p>
<p><strong>The spouse's number.</strong> He enquires on his own number and his wife walks in and gives hers. Both are correct contact numbers for one household and one purchase decision.</p>
<p><strong>Two spellings of one name.</strong> Transliteration from a regional script varies, initials expand or contract, and the caller writes what she heard through a call that was breaking up.</p>
<p><strong>A shared family email address.</strong> One address serves the father, the son and the business. Matching on it will merge people who are genuinely different, which is a worse error than missing a duplicate.</p>
<p><strong>The portal's proxy number.</strong> Some sources deliver a masked line that routes to the buyer rather than his actual number. Two enquiries from the same person through two portals arrive as two different numbers, neither of which is his.</p>
<p>Notice that half of these are cases where naive matching finds nothing, and half are cases where it would confidently merge two people who are not the same. Both errors are expensive and the second is harder to undo.</p>
<h2 id="what-a-duplicate-rule-should-do">What a duplicate rule should do<a class="anchor" href="#what-a-duplicate-rule-should-do" aria-label="Link to this section">#</a></h2>
<p><strong>Normalise before comparing.</strong> Strip everything that is not a digit, handle the country code the same way on every path in, and store one canonical form. This has to happen at the point of capture and on every route — portal feed, bulk import, walk-in form, the app the caller uses at a kiosk. A normaliser applied on three routes out of four produces duplicates that look impossible.</p>
<p><strong>Treat the phone as the spine and everything else as a hint.</strong> A matching number is strong evidence. A matching name is a reason to look. A matching email is barely anything. That ordering is the practical half of <a href="https://be-teck.com/blog/what-a-lead-record-should-hold/">what a lead record should hold</a>, and it is why alternate numbers deserve a real field rather than a line in a remarks box — they are the ones that catch the household case.</p>
<p><strong>Propose a merge; do not perform one.</strong> This is the important one. The system should say <em>this enquiry looks like that one, here are both, decide</em> — and then wait for a person. Automatic merging on a fuzzy match will eventually combine two genuine buyers, and the damage is silent: one buyer stops receiving calls, one history becomes nonsense, and nobody finds out until somebody looks for a record that no longer exists under its own name. The general form of this rule is <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes</a>, and duplicate detection is the case where it earns its keep most obviously.</p>
<p><strong>Never destroy the losing record's history.</strong> A merge should join two histories, not overwrite one with the other. The dates, the owners, the notes and the source of the second enquiry all survive.</p>
<h2 id="the-second-enquiry-is-information">The second enquiry is information<a class="anchor" href="#the-second-enquiry-is-information" aria-label="Link to this section">#</a></h2>
<p>This is the part most implementations miss. A duplicate is treated as a mistake to be cleaned up, and cleaning it up destroys the fact.</p>
<p>That the same man enquired three times in one week, through three channels, is the strongest intent signal in the file. It is worth more than any rating out of five. A merged record that shows three touches in six days, from three sources, tells the executive exactly how to open the call.</p>
<p>There is also a marketing fact in there. The portal, the hoarding and the broker each produced an enquiry from this buyer. If the merge overwrites source with the most recent one, the hoarding and the portal have both silently lost credit for a booking they helped produce, and next season's budget is set from that damaged number. Keep every touch with its own date and source, and let the current values sit on top of a history that is added to rather than rewritten — <a href="https://be-teck.com/blog/append-only-records/">append-only records</a> is the same discipline applied to a different desk.</p>
<h2 id="a-merge-is-an-ownership-decision">A merge is an ownership decision<a class="anchor" href="#a-merge-is-an-ownership-decision" aria-label="Link to this section">#</a></h2>
<p>Two records had two owners. One merged record has one. Somebody's name has been removed from a live enquiry, and if that enquiry books, somebody's earnings changed while a screen was being tidied.</p>
<p>This means a merge cannot be a housekeeping task handed to whoever has time on a Friday. It needs the same authority a reassignment needs, the same written rule about which owner prevails — first touch, most recent activity, the one who has actually met the buyer — and the same record of who decided and when. All of that is <a href="https://be-teck.com/blog/who-owns-the-lead/">who owns the lead</a>, and a duplicate policy written without settling it will be quietly ignored by the executives it costs.</p>
<p>There is a related trap. If the office knows that merging removes an owner, duplicates stop being reported. Everyone can see the second record and nobody raises it, because raising it might cost a colleague a case, or cost them one. A merge rule that names the losing owner and pays nothing to the finder is a rule that guarantees nobody looks.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The same buyer arrives through several channels in the same week, and exact matching on a phone number will not catch it.</p>
<p>Normalise numbers at every point of capture, treat the phone as the spine and the name and email as hints, and propose merges for a person to confirm rather than performing them automatically.</p>
<p>Keep both histories, keep every source and date, and treat the merge itself as a change of ownership requiring the same authority and the same record as any other.</p>]]></content:encoded></item>
<item><title>The site visit is the whole funnel</title><link>https://be-teck.com/blog/the-site-visit-is-the-funnel/</link><guid isPermaLink="true">https://be-teck.com/blog/the-site-visit-is-the-funnel/</guid><pubDate>Tue, 01 Sep 2026 21:25:00 +0530</pubDate><description>Almost nothing sells without a visit, so every stage before it exists to produce one and every stage after depends on what was recorded during it.</description><category>crm</category><category>sales</category><category>field</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>In primary residential and commercial sales in this country, almost nothing is sold without the buyer standing on the plot.</p>
<p>That single fact reorganises the whole pipeline. Every stage before the visit exists for one purpose, which is to produce a visit. Every stage after it depends entirely on what happened while the buyer was there, and on how much of that survived the drive home.</p>
<p>Most sales reviews spend their time on the counts at either end of the funnel. The visit sits in the middle, it is the most expensive event for both sides, and it is usually the worst recorded.</p>
<h2 id="where-visits-are-lost">Where visits are lost<a class="anchor" href="#where-visits-are-lost" aria-label="Link to this section">#</a></h2>
<p><strong>Scheduled and never confirmed.</strong> A visit fixed on Tuesday for Sunday, and nobody rings on Saturday evening. Some fraction of those people simply do not come, and the executive discovers it by waiting.</p>
<p><strong>The person who knows him is elsewhere.</strong> The buyer arrives and the executive who has spoken to him four times is on another visit, on leave, or at lunch. Whoever is free receives him, knows nothing about him, and starts again from the brochure. The buyer has to explain his own requirement to a stranger, which is the moment much of the goodwill built over four calls is spent.</p>
<p><strong>The sample flat is locked.</strong> Or the lift is not working, or the security staff have no instruction and the family waits at the gate, or the site is a mess because a pour is on. Each of these is somebody's ordinary day and all of them are the buyer's only impression.</p>
<p><strong>Nobody records the objection.</strong> He came, he liked the layout, he thought the carpet area was tight for the price and he did not like the distance from the main road. Nobody writes that down. The follow-up call two days later is the same pitch he has already rejected, delivered with enthusiasm, and it confirms to him that nobody was listening.</p>
<p><strong>The notes live in one person's phone.</strong> Written on WhatsApp, or in the executive's own notebook, or in his head. The manager cannot see them, the CRM desk cannot see them, and when the executive leaves the company the buyer's entire history leaves with him. That is the failure described in <a href="https://be-teck.com/blog/filed-as-chatter/">filed as chatter</a> — real work recorded somewhere that is not the record.</p>
<p><strong>The second visit with the family.</strong> He returns with his wife, his father and the brother-in-law who has opinions. Nobody prepared for it, so the decision makers who actually matter are met cold, in a group, without anybody knowing who among them needs convincing of what.</p>
<p><strong>The gap between visited and first follow-up.</strong> A visit ends, and the next contact happens some days later, when the executive gets around to the list. The buyer has seen two other projects in that time. Whatever heat the visit produced was allowed to cool because nothing insisted on a date, which is what <a href="https://be-teck.com/blog/follow-up-is-a-schedule/">follow-up as a schedule</a> exists to fix.</p>
<h2 id="the-five-things-to-capture">The five things to capture<a class="anchor" href="#the-five-things-to-capture" aria-label="Link to this section">#</a></h2>
<p>Not a form with twenty fields. Five, and each one has to earn its place by changing what somebody does next.</p>
<ul><li><strong>Who actually came.</strong> Not who was invited. The names and relationships of everybody who walked the site, because the person who asks the most questions is often not the person whose name is on the enquiry. This is the field that tells you who to invite for the second visit and whose objection is the one that matters.</li><li><strong>What they asked about.</strong> Questions are the shape of interest. Somebody asking about the possession timeline, the loan tie-up, or the school on the next road is telling you what he is actually deciding between.</li><li><strong>What they objected to.</strong> The most valuable of the five and the one most often left blank, because writing down an objection feels like admitting the visit went badly. It did not. An objection is the only thing the next conversation can usefully address.</li><li><strong>What was promised.</strong> A discount hinted at, a floor held, a payment plan suggested, a car park thrown in. Promises made at a site office have a way of becoming disputes at booking, and the person who made one is not always the person who has to honour it.</li><li><strong>The next action, with a date and a name.</strong> Same rule as everywhere else in the record: what, when, by whom. Without it the other four are notes, and notes do not ring.</li></ul>
<p>Everything else is optional. If a proposed sixth field cannot say who reads it and what changes because of it, leave it out. A longer form at the gate produces shorter answers, and the case for keeping the set small is made in <a href="https://be-teck.com/blog/what-a-lead-record-should-hold/">what a lead record should hold</a>.</p>
<h2 id="capture-it-before-he-leaves">Capture it before he leaves<a class="anchor" href="#capture-it-before-he-leaves" aria-label="Link to this section">#</a></h2>
<p>This is a discipline, not a feature, and it is the difference between the five fields being worth something and being worth nothing.</p>
<p>Written at the site, while the family is still walking back to the car, the notes contain what was actually said. Written that evening, after two more visits, they contain a summary of an impression. Written the next morning, under a manager's eye, they contain what the executive thinks the manager wants to read.</p>
<p>The obstacle is real: the executive's hands are full and he is being polite to a family. Which is why the capture has to survive being done badly. A voice note recorded in the car park, in whatever language the executive actually thinks in, is a better record than a form filled in perfectly six hours later — <a href="https://be-teck.com/blog/the-voice-note-is-the-report/">the voice note is the report</a> makes that case for the site side of the business, and it holds just as well at the sales office.</p>
<p>The same argument applies to the photograph. A picture of the flat the family stood in, taken during the visit and attached to the record, keeps its own date and its own subject, which is what makes <a href="https://be-teck.com/blog/a-site-photograph-is-a-record/">a site photograph a record</a> rather than a picture. It answers the question everybody asks at the second visit: which one did we show them?</p>
<h2 id="what-to-look-at-on-monday">What to look at on Monday<a class="anchor" href="#what-to-look-at-on-monday" aria-label="Link to this section">#</a></h2>
<p>Two questions, asked of last week's visits.</p>
<p>For how many is there a written objection? If it is a small share, the office is not recording the one thing that decides the sale.</p>
<p>And how many days passed between the visit and the first contact after it? Not the average — the worst one. That number is the honest measure of whether the most expensive event in your funnel is being followed up or filed.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Nothing sells without a visit, so the visit is the only stage where the pipeline is really decided.</p>
<p>Capture five things before the buyer leaves the site: who came, what they asked, what they objected to, what was promised, and the next action with a date and a name.</p>
<p>Notes taken in the car park beat notes written that evening, and an objection nobody wrote down guarantees a wasted follow-up call.</p>]]></content:encoded></item>
<item><title>Follow-up is a schedule, not a feeling</title><link>https://be-teck.com/blog/follow-up-is-a-schedule/</link><guid isPermaLink="true">https://be-teck.com/blog/follow-up-is-a-schedule/</guid><pubDate>Tue, 01 Sep 2026 21:20:00 +0530</pubDate><description>A follow-up that lives in somebody's memory is not a follow-up. Every conversation ends with a dated next action, or the lead closes with a reason.</description><category>crm</category><category>sales</category><category>notifications</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every sales manager believes his team follows up. Ask how, and the answer describes an intention: we stay in touch, we keep after them, nothing slips.</p>
<p>Intention is not a schedule. A schedule is a dated commitment that surfaces on the correct day whether or not anybody remembers it. Everything else is a feeling about a buyer, and a feeling does not appear on Monday morning's list.</p>
<h2 id="leads-do-not-go-cold-they-go-quiet">Leads do not go cold, they go quiet<a class="anchor" href="#leads-do-not-go-cold-they-go-quiet" aria-label="Link to this section">#</a></h2>
<p>"Cold" is a comfortable word because it puts the fault on the buyer. He lost interest. He was never serious. He was only comparing.</p>
<p>Sometimes that is true. More often what happened was a gap. The buyer walked the site, went home, and heard nothing for a week and a half. In that silence he spoke to two other people, and one of them rang back within a couple of days with the floor plan he had asked about.</p>
<p>Nothing was decided against you. You were simply absent during the only period in which he was actively thinking about it. By the time your call came, his question had already moved from <em>which project</em> to <em>which bank</em>.</p>
<p>This is why follow-up discipline pays better than any change to the pitch. The pitch competes on quality. The schedule competes on presence, and presence is the cheaper of the two to fix.</p>
<h2 id="two-endings-and-no-third">Two endings, and no third<a class="anchor" href="#two-endings-and-no-third" aria-label="Link to this section">#</a></h2>
<p>Every conversation with a prospective buyer must finish in one of two states.</p>
<ul><li><strong>A next action with a date.</strong> One name, one sentence saying what will happen, and the day it happens on. "Send revised cost sheet with the corner unit — Thursday." Not "follow up soon".</li><li><strong>Closed, with a reason.</strong> He booked elsewhere. His budget is half of ours. He is not buying for two years. The unit he wanted is already sold.</li></ul>
<p>Anything else is a lead in limbo, and limbo is where a pipeline turns into a number nobody trusts. A record with no next date and no closing reason is not being worked. It is being stored.</p>
<p>The reason matters as much as the date. A team that cannot close a lead without an argument will never close one, and the list grows until it is decorative. Make <em>spoke, not interested</em> a single, blameless action. The manager's job is to read those reasons, not to punish them.</p>
<h2 id="where-the-schedule-breaks">Where the schedule breaks<a class="anchor" href="#where-the-schedule-breaks" aria-label="Link to this section">#</a></h2>
<p>The method is trivial. The failures are specific, and most sales offices are running several of them at once.</p>
<p><strong>"Will call next week."</strong> No day, so no list can carry it. Next week arrives and the item is invisible, because the only place it ever existed was the end of a sentence.</p>
<p><strong>The reminder that fires at the wrong moment.</strong> It rings while the caller is on another call. He dismisses it to stop the noise. The dismissal is permanent and the record now reads as handled. An alert that can be silenced without recording an outcome is worse than no alert, and the whole failure class is <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<p><strong>An overdue list longer than the working day.</strong> When the pending list is bigger than anyone can finish, it stops being a set of obligations and becomes wallpaper. A couple of overdue items get attention; a screen full of them gets scrolled past. The overdue count is the health measure of the whole system, and letting it grow without limit kills the system quietly.</p>
<p><strong>Follow-ups timed for when the buyer is at work.</strong> Everything lands at ten in the morning because that is when the caller starts his day. Half the buyers are in meetings, the other half are driving. The item is attempted, unanswered and marked done. The record says contacted. Nobody was contacted.</p>
<p><strong>The eternal reschedule.</strong> The same item is pushed forward week after week with no new information between pushes. Each push feels like diligence. Together they are a decision nobody is willing to make — the lead is dead and no one wants to write that down. An item rescheduled many times without a conversation should look different on the screen from one due tomorrow.</p>
<p><strong>The shared spreadsheet.</strong> It has no notion of a date arriving, no notion of whose item this is, and no memory of what was promised. It is the most common follow-up system in the industry, and its particular failures are set out in <a href="https://be-teck.com/blog/leads-that-die-in-excel/">leads that die in Excel</a>.</p>
<h2 id="what-a-working-list-looks-like">What a working list looks like<a class="anchor" href="#what-a-working-list-looks-like" aria-label="Link to this section">#</a></h2>
<p>Small. That is the first property, and it decides all the others.</p>
<p>A caller opens his day and sees a handful of items due today, each carrying one line of context: who, what was last said, what was promised. If he has to open the record to remember the conversation, he will not open it. He will ring and improvise, and the buyer will hear it.</p>
<p>Every item needs a visible reason. "Call the customer" is an instruction. "Call — promised the revised cost sheet after he asked about the corner unit" is a conversation the buyer recognises from the first sentence. What the record itself has to carry for that to be possible is in <a href="https://be-teck.com/blog/what-a-lead-record-should-hold/">what a lead record should hold</a>.</p>
<p>And closing must be as easy as scheduling. If marking a lead dead means a long form and a dropdown nobody understands, the list only ever grows. Shrinking it is the healthy behaviour, so make it the cheapest action on the screen.</p>
<h2 id="the-ledger-of-what-was-not-sent">The ledger of what was not sent<a class="anchor" href="#the-ledger-of-what-was-not-sent" aria-label="Link to this section">#</a></h2>
<p>We built two things around this, and the second one surprised us.</p>
<p>The first was a ceiling. Every message has a home — a quiet feed, a daily bulletin, a knock, or the one tone that interrupts — and its home can only ever make a message quieter, never louder. Nothing promotes itself.</p>
<p>The second was a ledger recording who was told what and why, <strong>including the occasions when nothing was sent</strong>. That last entry is the one that earns its keep. When somebody says they were never informed, the useful record is not the list of messages that went out. It is the reasoned line explaining why one did not.</p>
<h2 id="the-manager-reads-reasons-not-counts">The manager reads reasons, not counts<a class="anchor" href="#the-manager-reads-reasons-not-counts" aria-label="Link to this section">#</a></h2>
<p>The weekly review in most offices is a count. Calls made, site visits done, bookings closed. Counts are easy to produce and easy to inflate — an unanswered call is still a call.</p>
<p>The useful review reads the closing reasons instead. A run of leads closed as <em>budget too low</em> is a pricing or a targeting problem, not a sales problem. A run closed as <em>unit not available</em> means the inventory the team is being asked to sell is not the inventory buyers are coming for. A run closed as <em>no response</em> usually means the first call went out too late.</p>
<p>None of that shows up in a count. All of it shows up in the reasons, and only if the reasons are cheap to record and honestly written.</p>
<p>The same principle governs work inside the office as governs buyers outside it. An obligation with a date can be watched, and something drifting can be seen before the deadline rather than after, which is the argument in <a href="https://be-teck.com/blog/work-slips-before-it-is-late/">work slips before it is late</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A follow-up that lives in somebody's memory is not a follow-up. Every conversation ends with a dated next action or a closing reason, and there is no third ending.</p>
<p>Keep the due list small enough to finish, give each item a reason the buyer would recognise, and make closing a lead as easy as postponing one. Then read the reasons at month end — the count will tell you the team was busy, and the reasons will tell you what to change.</p>]]></content:encoded></item>
<item><title>From booking to agreement: the document ladder</title><link>https://be-teck.com/blog/booking-to-agreement/</link><guid isPermaLink="true">https://be-teck.com/blog/booking-to-agreement/</guid><pubDate>Tue, 01 Sep 2026 21:15:00 +0530</pubDate><description>The paper between a verbal yes and a registered agreement, rung by rung, and the places a booking file quietly goes missing while everyone assumes it is fine.</description><category>crm</category><category>sales</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A booking is not a sale. It is the first rung of a ladder of documents, and the sale exists only when the ladder is complete and every rung agrees with every other rung.</p>
<p>What follows is the <em>structure</em> of that sequence. The legal requirements — what must be registered, what stamp duty applies, what disclosures are mandatory, what timelines bind you — differ by state and change. Take the structure from here and verify the version in force with your own advisor.</p>
<h2 id="the-rungs-in-order">The rungs, in order<a class="anchor" href="#the-rungs-in-order" aria-label="Link to this section">#</a></h2>
<p>The sales side, before the file becomes a legal instrument:</p>
<ol><li><strong>Expression of interest or application.</strong> The buyer states which unit, on what terms, and signs something. This is the first document with his handwriting on it and it is routinely treated as a formality.</li><li><strong>The booking amount and its receipt.</strong> Money moves. A receipt goes back naming the unit, the amount, the mode and the date. Not a WhatsApp acknowledgement.</li><li><strong>Allotment.</strong> Your side confirms the specific unit against that application. Until this exists, the buyer has paid for an intention.</li><li><strong>The cost sheet.</strong> Every component of what he will pay, in writing.</li><li><strong>KYC of every applicant.</strong> Identity and address for each name that will appear on the agreement, not just the one who came to the office.</li></ol>
<p>Then the legal side:</p>
<ol><li><strong>The agreement draft</strong>, prepared from the allotment and the cost sheet.</li><li><strong>The buyer's review</strong>, which is a real step with a real duration and often a lawyer at the other end.</li><li><strong>Execution and registration</strong>, whose formalities are governed by law in force where the project sits.</li><li><strong>The loan file</strong>, running in parallel the whole time, on its own schedule, asking for copies of everything above.</li></ol>
<p>The loan file is the one people forget when they design a process. It is not a step at the end. It starts early and it audits your paperwork on the bank's timetable rather than yours.</p>
<h2 id="what-the-cost-sheet-has-to-state">What the cost sheet has to state<a class="anchor" href="#what-the-cost-sheet-has-to-state" aria-label="Link to this section">#</a></h2>
<p>The cost sheet is the document most disputes come back to, because it is the only place where the whole price is assembled in one view.</p>
<p>It should state the base consideration and how it was derived, every additional charge by name, the taxes as separate lines rather than folded into a total, the payment plan with its stages, what is included in the unit and what is not, and what is not yet quantified. A charge that appears for the first time in a demand letter three years later, and was never on the cost sheet, is an argument you will lose in the room even if you win it on paper.</p>
<p>Date every version. Cost sheets are revised during negotiation, and each revision creates a document that looks exactly like the one it replaced.</p>
<h2 id="where-the-ladder-breaks">Where the ladder breaks<a class="anchor" href="#where-the-ladder-breaks" aria-label="Link to this section">#</a></h2>
<p><strong>The cost sheet that differs from what was said.</strong> The executive promised free covered parking and the sheet charges for it. The buyer signed the sheet, so you are legally comfortable and commercially finished, because he will remember the conversation for as long as he owns the flat.</p>
<p><strong>A second applicant added after allotment.</strong> A wife, a father, a son added later. Now KYC is incomplete, the allotment names one person and the agreement names two, and the bank asks which is correct.</p>
<p><strong>The unit sold twice.</strong> Blocked in the sales sheet by one executive and sold from the sample flat by another over a weekend. Inventory that lives in two places is inventory that will be sold twice, and the cost of unwinding it is paid entirely by you.</p>
<p><strong>KYC collected as photographs on a phone.</strong> A gallery of blurred documents in somebody's personal handset, some of which no longer exist because he changed his phone. Nobody can say which photograph belongs to which applicant.</p>
<p><strong>The document the bank asks for that nobody kept.</strong> The receipt for a payment made in the first month, the earlier version of the cost sheet, the signed application. Disbursement stops for a document you had and did not file.</p>
<p><strong>A draft signed after it was superseded.</strong> Two versions in circulation, one by email and one printed at the site office. The buyer signs the older one because it was the copy in front of him.</p>
<p><strong>The long gap with no owner.</strong> Months pass between booking and agreement. The executive who sold it moves on, no one inherits the file, and the buyer rings a number that has been reassigned. That entire period, and how to staff it, is <a href="https://be-teck.com/blog/after-booking-comes-the-longer-job/">after the booking comes the longer job</a>.</p>
<h2 id="the-sales-record-and-the-legal-file-are-different-things">The sales record and the legal file are different things<a class="anchor" href="#the-sales-record-and-the-legal-file-are-different-things" aria-label="Link to this section">#</a></h2>
<p>The sales record is the office's working memory: who this buyer is, what he was quoted, what is pending, who spoke to him last. It is edited constantly and that is correct.</p>
<p>The legal file is the set of documents that will be produced if anything is ever contested. It is not edited. Each item enters it once, in a fixed form, with the date it was signed and by whom.</p>
<p>Most offices keep one folder and treat it as both, which means the file that would be produced in a dispute has been edited by whoever needed to correct a phone number. Keeping them separate costs nothing but discipline, and the reasoning behind an unedited record is set out in <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>.</p>
<p>A related point about scans. A scanned copy is not the record unless somebody can prove <em>which</em> copy it is. Two PDFs of the same page, one signed and one not, are indistinguishable in a folder listing. Either the file itself carries evidence of what it is and when it was made, in the sense described in <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident documents</a>, or your archive is a collection of pictures.</p>
<p>Tell the buyer plainly to keep his own set as well — the receipt, the cost sheet he signed, the allotment, every payment acknowledgement. That habit is <a href="https://be-teck.com/blog/keep-your-own-copy/">keep your own copy</a>, and a buyer with his own file is easier to deal with, not harder.</p>
<h2 id="the-one-habit-worth-installing">The one habit worth installing<a class="anchor" href="#the-one-habit-worth-installing" aria-label="Link to this section">#</a></h2>
<p>A document checklist per unit, with a state per item, that the sales desk and the CRM desk both read from the same screen.</p>
<p>Not a checklist per project and not a checklist in somebody's diary. Per unit, because the unit is the thing that gets sold, financed, registered and handed over. Each item has a state — not required, pending with buyer, received, verified, filed — and a name against it.</p>
<p>When the bank rings, the answer takes seconds. When the executive leaves, his replacement opens the same screen.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Between yes and registration sits a fixed sequence of documents, and the sale is only as sound as the weakest rung.</p>
<p>Get the cost sheet complete and dated, collect KYC for every applicant before allotment, keep sales working notes separate from the legal file, and run one per-unit checklist that both desks read. Then verify the legal specifics for your state with your own advisor, because that part is not the same everywhere and it does not stay still.</p>]]></content:encoded></item>
<item><title>Demand letters, reminders, and the buyer who says nobody told him</title><link>https://be-teck.com/blog/the-demand-letter/</link><guid isPermaLink="true">https://be-teck.com/blog/the-demand-letter/</guid><pubDate>Tue, 01 Sep 2026 21:10:00 +0530</pubDate><description>A construction-linked demand is a document plus a delivery. Most collection disputes are about the second half, and the reconciliation is worse than both.</description><category>crm</category><category>money</category><category>notifications</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>On a construction-linked payment plan, the buyer does not pay on dates. He pays on events. A stage of work completes, you raise a demand, and money is due.</p>
<p>That sentence hides the entire collections function of a builder's office, and almost every dispute in it is not about whether the buyer owes the money. It is about whether the demand was properly raised, stated and received.</p>
<p>What follows is the structure. Interest on delay, permitted charges, notice periods and what a regulator requires you to state are set by law and vary by state and by project. Verify the version in force with your own advisor.</p>
<h2 id="what-actually-triggers-a-demand">What actually triggers a demand<a class="anchor" href="#what-actually-triggers-a-demand" aria-label="Link to this section">#</a></h2>
<p>Three things have to be true before a demand letter should leave your office.</p>
<ul><li><strong>A stage has completed.</strong> Not nearly completed. Not completed on the plan.</li><li><strong>Somebody has certified it.</strong> A named person, on a named date, whose certification exists as a document rather than as a conversation in a meeting.</li><li><strong>The trigger matches the buyer's agreement.</strong> The stage names in the payment schedule must be the stage names the site uses, or somebody is translating, and translation is where the argument starts.</li></ul>
<p>That third one is the quiet failure. The agreement says "on completion of the slab of the floor on which the said unit is situated". The site talks about the slab it poured last week. Whether those are the same event for a given unit is a question somebody must answer, and if the answer lives in one person's head it leaves when he does.</p>
<h2 id="what-the-demand-must-state">What the demand must state<a class="anchor" href="#what-the-demand-must-state" aria-label="Link to this section">#</a></h2>
<p>A demand that will not be disputed later says all of this on its face:</p>
<ol><li><strong>The unit</strong>, unambiguously — tower, floor, number, and the buyer's name as it appears on the allotment.</li><li><strong>The stage</strong> that triggered it, in the same words the agreement uses.</li><li><strong>The certification</strong> — who certified the stage complete, and when.</li><li><strong>The amount</strong>, broken into components rather than one figure: the instalment on the base consideration, each additional charge, and taxes separately.</li><li><strong>What was already paid</strong>, cumulatively, so the buyer can place this demand in the story of his own account.</li><li><strong>The due date</strong>, and how to pay — the account, the reference to quote.</li></ol>
<p>Number five is the one most offices skip, and the one that reduces disputes most. A buyer who can see his running account reconciles it himself. A buyer who sees only a fresh amount rings the office, and now your desk is doing accounting over the phone.</p>
<p>The accounting side of stage-linked money is not obvious, and it is set out in <a href="https://be-teck.com/blog/staged-payments-and-accounting/">staged payments and accounting</a>.</p>
<h2 id="the-three-ways-the-demand-itself-fails">The three ways the demand itself fails<a class="anchor" href="#the-three-ways-the-demand-itself-fails" aria-label="Link to this section">#</a></h2>
<p><strong>Raised late, so everybody defaults at once.</strong> The stage completed weeks ago, the demands went out as one batch, and now a whole tower is overdue on the same day. Your ageing report shows a collections crisis that is really an administrative delay, and the buyers who genuinely default are invisible inside the crowd.</p>
<p><strong>Raised on a stage that was not complete.</strong> Somebody read the programme instead of the site. The demand goes out, a buyer visits, photographs the slab that does not exist, and puts it in the buyers' group. You will withdraw that demand, and the withdrawal will be quoted back at you against every future demand on that project.</p>
<p><strong>Delivered nowhere.</strong> The letter went by email to an address the buyer gave at booking, or landed in a spam folder, or reached the son who forwarded nothing. Months later the buyer says, truthfully as far as he knows, that nobody told him.</p>
<h2 id="delivery-is-half-the-document">Delivery is half the document<a class="anchor" href="#delivery-is-half-the-document" aria-label="Link to this section">#</a></h2>
<p>A demand you cannot prove was delivered is, in practice, a demand that was not made. Delivery is part of the record, not an afterthought.</p>
<p>What counts as evidence, in ascending order of usefulness: a system log that a message was sent; a delivery receipt from the channel; a read acknowledgement; a tracked physical dispatch; a reply from the buyer about anything at all, which proves receipt more convincingly than any receipt does.</p>
<p>Two rules follow. Send on more than one channel, because channels fail independently and the buyer's habits are not yours. And keep the addresses current — contact details confirmed at booking are stale by the time later demands go out, which is one reason the relationship needs an owner throughout, as in <a href="https://be-teck.com/blog/after-booking-comes-the-longer-job/">after the booking comes the longer job</a>.</p>
<h2 id="the-reminder-ladder">The reminder ladder<a class="anchor" href="#the-reminder-ladder" aria-label="Link to this section">#</a></h2>
<p>Before escalation there should be a ladder, and each rung should sound different from the one before.</p>
<p>A courtesy reminder shortly before the due date, which assumes nothing. A reminder on the due date. A firmer one after it, restating the amount and the consequence in neutral language. Then a call from a person, because by this point the reason is usually specific — a disbursement stuck, a stage dispute, a family event — and none of those are visible to an automated message. Only then does formal escalation begin.</p>
<p>The rung that matters most is the one you must not send. <strong>An automatic reminder to a buyer who has already paid destroys more goodwill than three missed reminders.</strong> He paid, he has the receipt, and your system has just accused him. He will forward it to the group, and everyone behind on payment will now cite your accounting as unreliable.</p>
<p>That risk is not really about reminders. It is about a system that fires messages faster than it reconciles receipts, which is the general disease described in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>. If the money side cannot be trusted, switch the automatic rungs off until it can. A silent ladder is recoverable; a lying one is not.</p>
<h2 id="the-money-arrives-and-nobody-knows-whose-it-is">The money arrives and nobody knows whose it is<a class="anchor" href="#the-money-arrives-and-nobody-knows-whose-it-is" aria-label="Link to this section">#</a></h2>
<p>Then the harder half. A credit lands in the bank with a narration naming the remitter's father, or a company, or nothing useful at all. The buyer's name is not on it. The unit certainly is not.</p>
<p>Left unmatched, that money is simultaneously received and outstanding: the buyer knows he has paid, your ledger says he has not, and the reminder ladder is running against a man who is owed an apology. Matching a credit to the right account is its own discipline, and the mechanics are in <a href="https://be-teck.com/blog/matching-a-bank-line/">matching a bank line</a>.</p>
<p>On our own side we set one rule about this and have not relaxed it. A bank line settles against an open stage only on an exact match to the paise, on the other party's name echoing back in the narration, or on the tax arithmetic working out. Never on being close. An amount that is nearly right is the most dangerous evidence in a reconciliation: right often enough to be trusted, wrong often enough to file a receipt against the wrong person. Where nothing matches, the line stays unmatched and somebody is asked.</p>
<p>What helps is issuing a reference with the demand and insisting it be quoted, banking narrowly so credits arrive already segregated, and treating unmatched receipts as a queue somebody owns daily rather than a month-end problem. Money coming in from buyers and money going out to contractors are separate disciplines, which is the argument in <a href="https://be-teck.com/blog/two-payment-ladders/">two payment ladders</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A demand is a document plus a delivery, and the delivery is the half that gets disputed. State the stage, the certification, the components and the buyer's running position on the face of the letter, and keep evidence that it arrived.</p>
<p>Raise demands as stages complete rather than in batches, never on a stage the site has not certified, and never let an automatic reminder reach somebody who has already paid.</p>]]></content:encoded></item>
<item><title>A CRM and a task system are not the same thing</title><link>https://be-teck.com/blog/crm-or-task-system/</link><guid isPermaLink="true">https://be-teck.com/blog/crm-or-task-system/</guid><pubDate>Tue, 01 Sep 2026 21:05:00 +0530</pubDate><description>One is organised around a person outside the company, the other around work inside it. A builder needs both, and they should meet only at the crossing events.</description><category>crm</category><category>choosing-software</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A builder sets out to buy software and is shown two categories that look alike. Both have lists, owners, due dates, statuses and reminders. Both salesmen say their product does the other one as well.</p>
<p>They are not the same kind of thing, and the difference is not features. It is what the record is <em>about</em>.</p>
<h2 id="a-crm-is-organised-around-a-person-outside-the-company">A CRM is organised around a person outside the company<a class="anchor" href="#a-crm-is-organised-around-a-person-outside-the-company" aria-label="Link to this section">#</a></h2>
<p>Its unit is a relationship with somebody who does not work for you and may never transact at all.</p>
<ul><li><strong>The subject is outside your authority.</strong> You cannot assign him anything. You can only ask, offer, remind and wait.</li><li><strong>The horizon is months.</strong> Sometimes years. A buyer who enquired at launch and books at possession is a normal outcome.</li><li><strong>The hardest problem is identity.</strong> The same man enquires on a portal, at a hoarding number and through a broker, and arrives in your database three times over. Duplication and attribution — who gets credit, and therefore commission — are what a CRM lives or dies on.</li><li><strong>Most records end in nothing.</strong> This confuses people coming from an operations background. A pipeline where most enquiries never book is a healthy pipeline.</li></ul>
<p>That last property decides the design. Because most records end in nothing, closing one has to be cheap and blameless. A CRM that makes people feel bad about closing leads accumulates a graveyard, which is also how a spreadsheet pipeline fails — <a href="https://be-teck.com/blog/leads-that-die-in-excel/">leads that die in Excel</a>.</p>
<h2 id="a-task-system-is-organised-around-work-inside-the-company">A task system is organised around work inside the company<a class="anchor" href="#a-task-system-is-organised-around-work-inside-the-company" aria-label="Link to this section">#</a></h2>
<p>Its unit is an obligation: something that must be finished by somebody who works for you or under contract to you.</p>
<ul><li><strong>The subject is inside your authority.</strong> You can assign it, escalate it and demand a date.</li><li><strong>The horizon is days.</strong> A task open for months is not patient, it is stuck.</li><li><strong>The hardest problem is handover.</strong> Work rarely fails while somebody is doing it; it fails between two people, when one believes he has passed it on and the other has not accepted it — <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">why tasks stall between people</a>.</li><li><strong>A record that ends in nothing is a failure.</strong> The opposite of the CRM. An obligation that quietly evaporated is what the system exists to prevent.</li></ul>
<p>Two systems, two opposite definitions of a healthy record. That is why the merged <em>process</em> is worse than either.</p>
<h2 id="what-breaks-when-you-force-one-to-be-the-other">What breaks when you force one to be the other<a class="anchor" href="#what-breaks-when-you-force-one-to-be-the-other" aria-label="Link to this section">#</a></h2>
<p><strong>Leads modelled as tasks.</strong> Every enquiry becomes an item that must be completed. Buyers do not complete. So the list fills with items overdue through nobody's fault, the overdue count climbs past what any human reads, and the team learns that red means nothing. Once red means nothing, genuinely late internal work is red too, and invisible.</p>
<p>Worse, the task frame makes closure feel like failure. Nobody wants a column of items marked not done, so leads get rescheduled instead of closed, and you lose the closing reasons — the most valuable data a sales process produces.</p>
<p><strong>Internal work modelled as leads.</strong> A pipeline has stages, not completion. A snag sitting in "in progress" is fine by the model, because a pipeline record can legitimately sit anywhere for a long time. There is no notion of <em>done</em>, therefore none of <em>late</em>, therefore no accountability that survives a busy week. Ageing reports become stage counts, which tell you where things are and never that something is wrong.</p>
<p>The tell is the same in both directions. Look at a screen and ask what an untouched record means. In a CRM, the buyer went quiet. In a task system, somebody failed. If one screen must mean both, it means neither, and people stop reading it.</p>
<h2 id="the-events-that-cross-the-boundary">The events that cross the boundary<a class="anchor" href="#the-events-that-cross-the-boundary" aria-label="Link to this section">#</a></h2>
<p>Here is the honest part: a builder needs both, and pretending otherwise is how offices end up with a CRM accounts hates and a task tool sales never open.</p>
<p>They do not need to be one system. They need to meet at a small set of events where something outside the company creates work inside it, or the reverse.</p>
<ol><li><strong>A booking.</strong> A buyer says yes, and work begins for accounts, CRM documentation, the legal desk and inventory. One relationship event spawns several obligations, each with its own owner and date.</li><li><strong>A construction stage completing.</strong> An internal, physical fact becomes a demand on many buyers at once — the only event in the business that crosses from site to money to relationship in a single step.</li><li><strong>A payment received or missed.</strong> Money changes the buyer's standing and creates internal work: reconciliation, receipting, and sometimes a collections action. Money owed to you and money you owe run on separate rails — <a href="https://be-teck.com/blog/two-payment-ladders/">two payment ladders</a>.</li><li><strong>A snag raised by a buyer.</strong> A relationship event that becomes site work, and must come back with an answer the buyer can see.</li><li><strong>A possession or handover date.</strong> The one date that must be identical on both sides. When sales quote a month and site are working to another, the discrepancy is discovered by a buyer.</li></ol>
<p>Five events. A few more in a particular office — a cancellation, a transfer — but the list is short and fits on one page.</p>
<h2 id="integrate-at-the-events-not-by-merging">Integrate at the events, not by merging<a class="anchor" href="#integrate-at-the-events-not-by-merging" aria-label="Link to this section">#</a></h2>
<p>The temptation is a single system: one record type, one inbox, one report. It fails for the reason above — the two record types have contradictory definitions of health, so any shared screen must lie about one of them.</p>
<p>What works is narrower. For each crossing event, decide four things and write them down.</p>
<ul><li><strong>Which system is the source of truth</strong> for the fact. A booking is a sales fact. A stage completion is a site fact. Only one side may create it.</li><li><strong>What it creates on the other side</strong>, precisely — which obligations, with which owners and which dates.</li><li><strong>What flows back</strong>, and to whom. A buyer whose demand is unpaid should be visible to whoever is about to call him about possession.</li><li><strong>What happens when it is reversed.</strong> Cancellations, unwound bookings and withdrawn demands are the cases nobody specifies, and the ones that leave orphan work in a queue for years.</li></ul>
<p>Ask a vendor to demonstrate these crossings rather than the feature list, alongside the other questions in <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a>. A product with a handsome pipeline and a handsome task board that cannot show what a booking does to accounts is two products in one window.</p>
<h2 id="which-one-we-built">Which one we built<a class="anchor" href="#which-one-we-built" aria-label="Link to this section">#</a></h2>
<p>Ours is a task system. It holds obligations, owners, dates, money and approvals; it has no lead pipeline, no buyer database and no broker ledger. Saying that plainly is more useful than pretending otherwise.</p>
<p>The one thing we do at that edge is small on purpose: a WhatsApp line marked for sales is answered from a pitch an admin writes, and every conversation lands as a card in the approvals queue for a person to pick up. That is a doorway, not a CRM.</p>
<p>The work a booking creates runs for years and has its own staffing problem — <a href="https://be-teck.com/blog/after-booking-comes-the-longer-job/">after the booking comes the longer job</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A CRM tracks a relationship with somebody outside the company, over months, where most records ending in nothing is normal. A task system tracks an obligation inside the company, over days, where a record ending in nothing is a failure.</p>
<p>Forcing either to be the other produces a list nobody reads. Buy both if you must, but spend the evaluation on the events that cross between them — booking, stage, payment, snag, possession — because that is where the money and the goodwill leak.</p>]]></content:encoded></item>
<item><title>After the booking comes the longer job</title><link>https://be-teck.com/blog/after-booking-comes-the-longer-job/</link><guid isPermaLink="true">https://be-teck.com/blog/after-booking-comes-the-longer-job/</guid><pubDate>Tue, 01 Sep 2026 21:00:00 +0530</pubDate><description>The years between booking and possession are where a builder's reputation is actually made, and most sales offices are neither staffed nor organised for them.</description><category>crm</category><category>sales</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A sales office is built for the weeks before a booking. Enquiries, site visits, negotiation, closing. Everything — the incentives, the reviews, the software, the seating — points at the moment a buyer says yes.</p>
<p>Then the buyer says yes, and a relationship begins that will run for years. It is longer than the sale, it involves more money changing hands than the booking amount, and almost nobody is staffed for it.</p>
<h2 id="what-actually-happens-in-those-years">What actually happens in those years<a class="anchor" href="#what-actually-happens-in-those-years" aria-label="Link to this section">#</a></h2>
<p>Not one thing. A long, uneven sequence of small events, each of which is somebody's job on the day it happens and nobody's job in general.</p>
<ul><li><strong>Demands and receipts.</strong> Stage after stage, each raised, delivered, chased and reconciled — the whole cycle in <a href="https://be-teck.com/blog/the-demand-letter/">demand letters, reminders, and the buyer who says nobody told him</a>.</li><li><strong>Loan disbursements arriving out of order.</strong> The bank pays on its own assessment and its own timetable, which is not your payment plan. Part payments land against the wrong stage and the ledger drifts.</li><li><strong>Changes the buyer wants in the unit.</strong> A wall, a socket position, a different tile. Each is a commercial decision, a site instruction and a cost adjustment, in that order.</li><li><strong>Changes to who the buyer is.</strong> A nominee added, a co-applicant removed after a family event, a transfer to an entirely new buyer, a death in the family that changes everything.</li><li><strong>Cancellation and refund.</strong> Rare, painful, and the process nobody has written down until the first one happens.</li><li><strong>Address, phone and email changes.</strong> Boring, and the reason a demand letter later reaches nobody.</li><li><strong>Possession, snags and the handover of documents.</strong> The end, which is really its own project.</li></ul>
<p>Running underneath all of it is the thing the buyer wants most and receives least: knowing how his building is coming along.</p>
<h2 id="where-it-fails">Where it fails<a class="anchor" href="#where-it-fails" aria-label="Link to this section">#</a></h2>
<p><strong>The person who sold it has left.</strong> The single most common failure, and the most expensive. The buyer's entire relationship lived in one executive's memory and phone. He resigns, and the file is inherited by nobody. The next call the buyer makes is to a number that no longer answers.</p>
<p><strong>The buyer's only contact is a personal mobile number.</strong> Which means the relationship is with a man, not with the company. When he leaves he takes it, and while he is there he is answering buyer calls on a Sunday and giving answers no one else can see or check.</p>
<p><strong>A promised change agreed verbally at site.</strong> The buyer visits, meets the site engineer, asks for a change, and the engineer nods. Nothing is written. The change may happen and never be billed, or be billed and never happen, and both versions surface at possession when the buyer is standing in the flat with a measuring tape.</p>
<p><strong>A payment made to the wrong account.</strong> An old account, a personal account, a broker's account. The money exists but not where your ledger looks, and until somebody matches it the buyer is being chased for money he has already paid.</p>
<p><strong>A change agreed in the office that never reaches site.</strong> CRM records it, the buyer pays for it, and the work is executed to the original drawing. This is the same failure as the previous one with the arrow reversed, which tells you the fault is the boundary itself, not either department.</p>
<p><strong>A buyer who first hears about a delay from a neighbour.</strong> He learns from somebody in the building's group that possession has slipped. You did not tell him because there was nothing definite to say yet. What he concludes is not that you were being careful. It is that you were hiding it.</p>
<h2 id="the-owner-has-to-be-a-role-not-a-person">The owner has to be a role, not a person<a class="anchor" href="#the-owner-has-to-be-a-role-not-a-person" aria-label="Link to this section">#</a></h2>
<p>The correction is structural and it costs nothing to state, though something to enforce.</p>
<p>After booking, the buyer relationship must be owned by a <strong>role</strong> — the CRM desk for that project, the post-sales executive for that tower — and every communication must go through channels the company controls. A company number, a company email, a company account. When somebody leaves, the role is reassigned and the buyer notices nothing.</p>
<p>The test is simple: if an executive resigns tomorrow, can his replacement open one screen and see everything this buyer has been told, asked, promised and paid? If the answer requires access to a personal WhatsApp history, the relationship is not yours.</p>
<p>This is the same question as who owns an enquiry before booking. Ownership by name is convenient and fragile; ownership by role survives people leaving. The pre-booking version of the argument is in <a href="https://be-teck.com/blog/who-owns-the-lead/">who owns the lead</a>.</p>
<h2 id="one-file-per-unit-readable-by-both-sides">One file per unit, readable by both sides<a class="anchor" href="#one-file-per-unit-readable-by-both-sides" aria-label="Link to this section">#</a></h2>
<p>The second correction is that sales, CRM and site must read the same per-unit file rather than three files that agree only when someone reconciles them.</p>
<p>It should hold the buyer and every co-applicant, the document ladder and its current state as in <a href="https://be-teck.com/blog/booking-to-agreement/">from booking to agreement</a>, the payment plan with what has been demanded and what received, every approved change to the unit with its cost and its date, every commitment made to this buyer and by whom, and the current possession position.</p>
<p>The load-bearing word is <em>approved</em>. A change becomes real when it is recorded, priced and accepted, not when somebody nods at site. Until then it is a request, and it should be visible on the file as a request so that neither party can later claim it was settled.</p>
<h2 id="silence-is-a-message-and-it-is-the-wrong-one">Silence is a message, and it is the wrong one<a class="anchor" href="#silence-is-a-message-and-it-is-the-wrong-one" aria-label="Link to this section">#</a></h2>
<p>The last correction is the cheapest and the most neglected. Send a proactive update on a schedule, whether or not there is news.</p>
<p>Buyers do not chiefly want good news. They want to know that somebody is holding their file. A quarterly note saying which stage is complete, what is next, and where their payments stand costs an hour per project and removes most of the incoming calls that make post-sales feel unmanageable.</p>
<p>When there is a delay, say it early and say what changed. A buyer told late concludes he was deceived, and he will read every later communication in that light. Bad news delivered early is a schedule; bad news delivered late is a grievance.</p>
<p>And plan the ending properly, because possession is where every loose thread arrives at once — snags raised and closed, as in <a href="https://be-teck.com/blog/the-snag-list-that-closes/">the snag list that closes</a>, alongside the transfer of documents, warranties and drawings, whose usual failures are in <a href="https://be-teck.com/blog/what-makes-a-handover-fail/">what makes a handover fail</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The years between booking and possession carry more money, more paperwork and more reputational risk than the sale, and most offices treat them as an afterthought staffed by whoever is free.</p>
<p>Give the relationship a role rather than a person, keep every channel on company infrastructure, run one per-unit file that sales and site both read, and send an update on a schedule so that silence is never what the buyer hears. The sale is a day. This is the job.</p>]]></content:encoded></item>
<item><title>How to choose construction software without regretting it</title><link>https://be-teck.com/blog/choosing-construction-software/</link><guid isPermaLink="true">https://be-teck.com/blog/choosing-construction-software/</guid><pubDate>Tue, 01 Sep 2026 20:45:00 +0530</pubDate><description>Most of these purchases fail in the evaluation, not in the product. Follow three real transactions end to end, then watch for the parallel register.</description><category>choosing-software</category><category>principles</category><category>builders</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Most construction software purchases that go wrong did not buy bad software. They bought reasonable software after an evaluation that could not possibly have found the problem.</p>
<p>Two habits cause this, and they compound.</p>
<p>The evaluation is done by people who will never use the thing. A director, an IT person, sometimes an accountant. Not the storekeeper standing at the gate at eight in the evening with a lorry waiting, the driver impatient and a phone in one hand.</p>
<p>And it is done against a feature list. A feature list is a list of nouns. Your office does not run on nouns. It runs on a small number of transactions that repeat all day, each with an awkward variant that nobody has written down.</p>
<h2 id="pick-three-transactions-and-follow-them">Pick three transactions and follow them<a class="anchor" href="#pick-three-transactions-and-follow-them" aria-label="Link to this section">#</a></h2>
<p>Before you look at anything, choose the three transactions that carry your money and your risk. For most builders they sit close to these:</p>
<ul><li><strong>A material receipt.</strong> A lorry at the gate, a challan, a short delivery, and a storekeeper who must decide whether to accept it.</li><li><strong>A bill approval.</strong> A vendor invoice arriving, being checked against what was ordered and what actually came, and being passed by whoever is allowed to pass it.</li><li><strong>A payment.</strong> Money leaving against a specific bill, with whatever deduction and whatever signature your practice requires.</li></ul>
<p>Now take each one end to end, and take it with <em>your</em> material. Your challan, with your supplier's handwriting on it and the quantity overwritten once. Your approval chain, including the partner who is usually travelling. Your worst case — the partial delivery, the rate revised in a WhatsApp message, the payment that had to move before the material did.</p>
<p>Three transactions followed properly will tell you more than forty features demonstrated. The method for doing that without being managed through it is in <a href="https://be-teck.com/blog/how-to-run-a-software-demo/">the demo is not the product</a>.</p>
<h2 id="the-six-axes-that-actually-decide-it">The six axes that actually decide it<a class="anchor" href="#the-six-axes-that-actually-decide-it" aria-label="Link to this section">#</a></h2>
<p>Everything else is decoration.</p>
<p><strong>Does it work where the work happens?</strong> A record is only true if it is made at the moment and place of the event. If the site writes on paper and somebody types it in the office at night, you have not bought a record; you have bought a second copy of one, arriving late. Sites have bad signal, so ask hard about what happens with the network off, and treat the answer sceptically — <a href="https://be-teck.com/blog/evaluating-offline-claims/">evaluating offline claims</a> sets out what to test.</p>
<p><strong>Can the people who must use it read it?</strong> Not the head office. The storekeeper, the guard, the junior engineer, the supervisor whose English is his fourth language. If the screen they need is dense, English-only and built for a desk, it will be used by proxy or not at all. What good looks like is in <a href="https://be-teck.com/blog/software-your-staff-can-read/">software your staff can read</a>.</p>
<p><strong>Can it prove what happened?</strong> Six months later, when a supplier disputes a quantity, you need to know who recorded what, when, and what it said before it was edited. Ask to see it on a record you created yourself, as in <a href="https://be-teck.com/blog/ask-to-see-the-audit-trail/">ask to see the audit trail</a>.</p>
<p><strong>Does it fit the approvals you already have?</strong> Every organisation has a real approval structure, and it is rarely the one on the chart. Somebody signs below a limit, somebody else above it, and a partner overrides both when a lorry is waiting. Software that insists on its own chain will be worked around within a month, and the workaround becomes the process.</p>
<p><strong>Can you get your data out?</strong> Not a report. Every record, the attachments, the links between them. Test it during evaluation, not on the day you leave — <a href="https://be-teck.com/blog/getting-your-data-back-out/">getting your data back out</a>.</p>
<p><strong>What happens on the day the vendor stops answering?</strong> Vendors are acquired, change direction, or simply lose interest in a customer of your size. Ask who else runs this at your scale, and what happens to your data and your logins if support ends.</p>
<h2 id="a-gap-you-can-live-with-and-a-gap-you-cannot">A gap you can live with, and a gap you cannot<a class="anchor" href="#a-gap-you-can-live-with-and-a-gap-you-cannot" aria-label="Link to this section">#</a></h2>
<p>Every system will be missing something. The useful distinction is not big versus small; it is whether the gap makes the record unreliable.</p>
<p>A gap you can live with is one where the work is inconvenient but the record stays true. A field you must fill twice. A report you assemble in a spreadsheet once a month. An approval that needs an email alongside it. These cost time, and time is recoverable.</p>
<p>A gap that makes the record unreliable is one where the system quietly stores something that is not what happened. A receipt that cannot represent a short delivery, so the storekeeper enters the full quantity and mentions the shortage on the phone. A bill that cannot hold a disputed line, so the disagreement happens in a meeting and only the outcome is stored. An edit that overwrites the previous value with no trace.</p>
<p>The first kind you negotiate about. The second kind you walk away from, because every month it runs, the archive fills with confident, wrong numbers, and you will not know which ones.</p>
<h2 id="do-not-decide-on-the-demo">Do not decide on the demo<a class="anchor" href="#do-not-decide-on-the-demo" aria-label="Link to this section">#</a></h2>
<p>The demo tells you whether the product can do the work. It cannot tell you whether your organisation will do the work in it. Only a trial does that, and only if it is designed to be capable of failing — <a href="https://be-teck.com/blog/a-pilot-that-tells-you-something/">a pilot that tells you something</a> covers how to set the pass criteria before you start, rather than after you have already spent the money.</p>
<p>Price belongs in the same category. The licence is the visible part of a number with several other parts, and the other parts are larger and arrive later. Ask for the whole shape of it in writing, as in <a href="https://be-teck.com/blog/the-real-cost-of-software/">what a price list does not tell you</a>.</p>
<h2 id="the-single-test">The single test<a class="anchor" href="#the-single-test" aria-label="Link to this section">#</a></h2>
<p>After the pilot, walk to the site office and the accounts desk and look for a parallel register.</p>
<p>A notebook at the gate. A spreadsheet somebody maintains "for our own hisaab". A WhatsApp group where the real numbers travel. A printed sheet on a clipboard that the supervisor still fills.</p>
<p>If anyone is still keeping one, the tool has not been adopted. It has been added. The old system is still the system of record and the new one is a reporting layer that somebody feeds, which means you are now paying for the work twice and will eventually stop paying for one of them.</p>
<p>Nobody keeps a parallel register out of nostalgia. They keep it because the software cannot hold something they need, or cannot be reached at the moment they need it. Ask what that thing is. The answer is the honest review of the product, and it is free.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Evaluate with the people who will use it, using three real transactions and your own worst documents. Judge on where it works, who can read it, what it can prove, whose approvals it fits, and what you leave with.</p>
<p>Distinguish a gap that costs time from a gap that makes the record untrue. And after the trial, go and look for the notebook.</p>]]></content:encoded></item>
<item><title>The demo is not the product</title><link>https://be-teck.com/blog/how-to-run-a-software-demo/</link><guid isPermaLink="true">https://be-teck.com/blog/how-to-run-a-software-demo/</guid><pubDate>Tue, 01 Sep 2026 20:40:00 +0530</pubDate><description>A demo is a rehearsed path through clean data. Bring your ugliest challan, ask for the keyboard, and insist on a dated written list of what was promised.</description><category>choosing-software</category><category>how-we-work</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A demo is a rehearsed path through clean data.</p>
<p>That is not an accusation. It is what a demo is for. The sales engineer has walked this path a hundred times, the sample vendors have sensible names, the quantities are round and every document was created by the same person that morning.</p>
<p>Everything that will go wrong in real use is off that path. So an evaluation session is worth having only to the extent that you take it off the path.</p>
<h2 id="bring-your-own-material">Bring your own material<a class="anchor" href="#bring-your-own-material" aria-label="Link to this section">#</a></h2>
<p>Before the meeting, collect four documents from your own files. Photocopies or photographs are fine. Bad ones are better.</p>
<ul><li><strong>A challan photograph with a smudged number.</strong> Taken at the gate, at dusk, slightly out of focus, with one figure overwritten. The one your storekeeper actually sends.</li><li><strong>A vendor bill whose total is wrong.</strong> Quantity times rate does not equal the line, or the tax is calculated on the wrong base. These exist in every office and they are the whole reason for checking.</li><li><strong>An invoice for a partial delivery.</strong> Half the order came, the invoice is for half, the order is still open. Many systems cannot say this cleanly.</li><li><strong>A work order with a variation on it.</strong> Extra work agreed after the fact, at a rate settled verbally and confirmed in a message.</li></ul>
<p>Hand these over at the start and say you would like to see them entered. Not described. Entered.</p>
<h2 id="ask-for-the-keyboard">Ask for the keyboard<a class="anchor" href="#ask-for-the-keyboard" aria-label="Link to this section">#</a></h2>
<p>Where the meeting allows it, the person who will actually use the screen should do the typing, on the vendor's laptop, with the sales engineer watching rather than driving.</p>
<p>This single change tells you more than the rest of the session. You find out how many fields there are, which ones are compulsory for no reason, what the error message says when a date is entered in the Indian order, and whether your storekeeper can find the save button without being told.</p>
<p>When the vendor's hands are on the keyboard, you are watching a performance of competence. It is theirs, not yours.</p>
<h2 id="the-things-to-ask-to-see-not-to-be-told">The things to ask to see, not to be told<a class="anchor" href="#the-things-to-ask-to-see-not-to-be-told" aria-label="Link to this section">#</a></h2>
<p>Ask in these words: <em>show me</em>. A promise is not evidence and costs nothing.</p>
<p><strong>A correction after approval.</strong> A bill was passed and the quantity was wrong. Fix it in front of you. Watch whether the old value survives anywhere, who is recorded as having changed it, and whether the approver is told. Then look at the record's history, using the questions in <a href="https://be-teck.com/blog/ask-to-see-the-audit-trail/">ask to see the audit trail</a>.</p>
<p><strong>A cancelled document.</strong> Not deleted — cancelled. A challan entered against the wrong site, a duplicate receipt, a purchase order raised and then dropped. Ask what happens to anything already linked to it.</p>
<p><strong>A duplicate.</strong> Enter the same challan number for the same vendor twice. A system that accepts it silently will accumulate duplicates for years. A system that refuses it outright will eventually block a legitimate case, because suppliers do repeat numbers across financial years.</p>
<p><strong>The screen the storekeeper will use.</strong> Not the dashboard. The narrow, dull, frequently used screen where a lorry gets received. Ask how many taps it takes one-handed on a mid-range phone. If the answer is a laptop, you have learnt something important.</p>
<p><strong>What happens with the network off.</strong> Turn the wifi off on the demo machine, or ask them to put the phone in flight mode, and continue. Watch the entry being made, then watch it arrive when the connection returns.</p>
<p><strong>The audit trail of the record you just made.</strong> Not of a sample record. The one created ten minutes ago from your smudged challan.</p>
<p><strong>The export.</strong> Ask for the data you entered today to come out as a file, and open the file in the room.</p>
<h2 id="red-flags">Red flags<a class="anchor" href="#red-flags" aria-label="Link to this section">#</a></h2>
<p>None of these is fatal on its own. Two together should slow you down.</p>
<p><strong>"That's on the roadmap."</strong> Treat a roadmap item as not existing. It may arrive, but it will not arrive on the date you need it and no part of your decision should depend on it.</p>
<p><strong>A demo environment they will not let you touch.</strong> If you cannot have a login to a sandbox for a week, ask why. The usual reason is that the unrehearsed paths are not presentable.</p>
<p><strong>No answer about who else runs this at your scale.</strong> You are not asking for names they cannot give. You are asking whether a builder of your size, with your number of sites, is already living with the product.</p>
<p><strong>Refusal to show an error state.</strong> Every real system has failures, retries and messages. A vendor unwilling to show one is telling you the messages are not fit to be seen. Whether an error explains itself is the difference described in <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>
<p><strong>A dashboard shown for longer than data entry.</strong> Charts are the easiest part of any system to build and the least used. The time split in the demo is a fair estimate of where the product's attention has gone.</p>
<h2 id="get-it-in-writing-dated">Get it in writing, dated<a class="anchor" href="#get-it-in-writing-dated" aria-label="Link to this section">#</a></h2>
<p>The demo is the only moment in the whole relationship when the vendor is answering questions rather than asking for money. After the contract, the same questions go to a support queue.</p>
<p>So before the session ends, agree that a written list will follow: what was shown, what exists today, what is configuration, what is custom work, what is on a roadmap, and what was said about data export and about support. Dated, and from the vendor rather than from your own notes.</p>
<p>You are not building a case for a dispute. You are removing the ambiguity that otherwise settles in over the following months, when everybody involved remembers the meeting differently and nobody is lying.</p>
<p>Then stop deciding. A demo can only tell you whether the product can do the work. Whether your organisation will do the work in it is a separate question, answered by a trial designed to be capable of failing — <a href="https://be-teck.com/blog/a-pilot-that-tells-you-something/">a pilot that tells you something</a>. The wider decision it feeds into is in <a href="https://be-teck.com/blog/choosing-construction-software/">how to choose construction software</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The demo path is clean because it was rehearsed. Take it off the path with your own smudged, wrong, partial documents, and ask for the keyboard.</p>
<p>Insist on seeing corrections, cancellations, duplicates, the storekeeper's screen, the network off, the audit trail and the export. Then get the promises in writing, dated, while the vendor is still answering.</p>]]></content:encoded></item>
<item><title>A pilot that tells you something</title><link>https://be-teck.com/blog/a-pilot-that-tells-you-something/</link><guid isPermaLink="true">https://be-teck.com/blog/a-pilot-that-tells-you-something/</guid><pubDate>Tue, 01 Sep 2026 20:35:00 +0530</pubDate><description>Most trials are run by the enthusiast, on the best site, with the vendor typing. Design one whose outcome is informative rather than political.</description><category>choosing-software</category><category>how-we-work</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The usual pilot is run by the person who wanted the software, on the newest project, with the vendor's engineer sitting in the site office for a fortnight.</p>
<p>It measures nothing. It measures whether an enthusiastic person, given help, can operate a system. That was never in doubt.</p>
<p>A pilot is an experiment, and an experiment that cannot come out badly is not an experiment. It is the last stage of <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a>, and the design decisions below are all aimed at one thing: making failure visible while it is still cheap.</p>
<h2 id="design-rules">Design rules<a class="anchor" href="#design-rules" aria-label="Link to this section">#</a></h2>
<p><strong>One complete process, not one department.</strong> Take a record and let it travel the whole way — order raised, lorry received at the gate, bill checked, payment released. A pilot confined to the stores tells you the stores screen works and nothing about the handoffs, which is where systems actually fail.</p>
<p><strong>An ordinary site, not the best one.</strong> The best site has your best people, your newest cabin and, usually, your best connectivity. If it succeeds there you have learnt that it works under favourable conditions. Choose the site with average staff, average signal and an average storekeeper.</p>
<p><strong>Long enough to include a month-end.</strong> Month-end is when the awkward cases surface all at once: bills that must be booked in the right period, deliveries made on the last evening, reconciliations, the accountant's queries. A trial that ends on the twenty-fifth has skipped the hardest week of the cycle.</p>
<p><strong>The vendor does not do the data entry.</strong> This is the rule most often broken and the one that ruins the most trials. If the vendor's engineer keys in the receipts, or sits beside the storekeeper prompting, you are testing the engineer. Let him train, then let him leave the room.</p>
<p><strong>Pass criteria in writing, before it starts.</strong> Two paragraphs are enough, but they must exist on paper before anybody is emotionally committed. Without them, the trial ends with a discussion in which whoever argues best wins, and the person who argues best is usually the person who chose the software.</p>
<h2 id="what-to-measure">What to measure<a class="anchor" href="#what-to-measure" aria-label="Link to this section">#</a></h2>
<p>Five things, all of them observable without anybody's opinion.</p>
<ul><li><strong>Did the parallel register stop?</strong> The notebook at the gate, the spreadsheet kept "for our own hisaab". If it is still being written, the tool is not the record. Everything else you measure is secondary to this.</li><li><strong>How long does the slowest real user take on the commonest transaction?</strong> Not the average, and not the champion. Stand at the gate with a watch during a normal delivery. The commonest transaction is done hundreds of times a month, and a slow screen is a tax collected every time.</li><li><strong>How many records needed a correction?</strong> And of those, how many were corrected because the person made a mistake, and how many because the system could not hold what actually happened.</li><li><strong>What did people do when they got stuck?</strong> This is the most informative question in the whole exercise. Did they read the message on screen and recover, ask a colleague, ring the head office, or write it on paper and carry on? The last answer is the one to worry about.</li><li><strong>How many questions had to go to the vendor?</strong> Count them, and keep them. After go-live those questions become a support queue with a response time, and the volume you saw in the pilot is the volume you will pay for.</li></ul>
<h2 id="how-pilots-lie">How pilots lie<a class="anchor" href="#how-pilots-lie" aria-label="Link to this section">#</a></h2>
<p><strong>The champion who compensates for the tool.</strong> One person quietly fixes the entries every evening, chases the site for what was missed, and re-keys what came over WhatsApp. The dashboard looks correct. Roll it out to twelve sites and there is one of him, not twelve, and the numbers go wrong everywhere at once. Ask the champion, privately, what he has been doing after hours.</p>
<p><strong>The sample too small to hit the awkward cases.</strong> Partial deliveries, credit notes, cancelled orders, a rate revised mid-order, material returned to the supplier — these are a minority of transactions and a majority of the pain. If none occurred during the trial, the trial did not test the system. Force them: run a real short delivery and a real cancellation on purpose.</p>
<p><strong>Scope creep, so nothing is concluded.</strong> Someone adds payroll in week three, then asks whether it can do drawings. Now the trial is a general enquiry, ends without a verdict, and the decision falls back to whoever is keenest. Freeze the scope on day one and write down what is out.</p>
<p><strong>The pilot that succeeds and is then rolled out to strangers.</strong> The trial site was trained face to face over a fortnight. The other sites get a video call and a PDF. The pilot proved the software works when people are taught; it proved nothing about the training you are actually willing to pay for. Budget the real training before you count the pilot a success — the shape of that cost is in <a href="https://be-teck.com/blog/the-real-cost-of-software/">what a price list does not tell you</a>.</p>
<p>Two conditions deserve deliberate stress while you have the vendor's attention. Take a phone to the basement or the far corner of the site and enter a receipt with no signal, which is the real form of the claim examined in <a href="https://be-teck.com/blog/evaluating-offline-claims/">evaluating offline claims</a>. And ask for an export in the first week rather than the last.</p>
<h2 id="ending-it-cleanly">Ending it cleanly<a class="anchor" href="#ending-it-cleanly" aria-label="Link to this section">#</a></h2>
<p>Pilots that are not ended stay alive for years as a half-used login and a small monthly charge.</p>
<p>Decide against the written criteria, in one meeting, with the people who did the entry present rather than represented. If it passed, say what the rollout depends on. If it failed, say which of the criteria it failed, because that sentence is worth more to the next evaluation than the whole trial.</p>
<p>Then deal with the data. Ask for a full export of everything entered during the trial, in a format you can open, and check it before the account is closed — the tests for that are in <a href="https://be-teck.com/blog/getting-your-data-back-out/">getting your data back out</a>. If you are not continuing, ask in writing for the trial data to be deleted, and for confirmation once it is done. Your vendor rates, your site addresses and your staff's phone numbers were all in there.</p>
<p>Finally, take the failures back into the next evaluation. Every awkward case the pilot found is a case to put in front of the next vendor at demo stage, which is the point of <a href="https://be-teck.com/blog/how-to-run-a-software-demo/">the demo is not the product</a>. A failed pilot that produced a good list is not a wasted quarter.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Pick one whole process on an ordinary site, run it past a month-end, keep the vendor's hands off the keyboard, and write the pass criteria before you start.</p>
<p>Measure whether the parallel register stopped, how slow the slowest user is, and what people did when they got stuck. Then end it in one meeting, get the data out, and carry the awkward cases forward.</p>]]></content:encoded></item>
<item><title>What a price list does not tell you</title><link>https://be-teck.com/blog/the-real-cost-of-software/</link><guid isPermaLink="true">https://be-teck.com/blog/the-real-cost-of-software/</guid><pubDate>Tue, 01 Sep 2026 20:30:00 +0530</pubDate><description>The licence is the visible part. Migration, training, per-user pricing and the cost of leaving are larger, arrive later, and are rarely quoted at all.</description><category>choosing-software</category><category>money</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The licence fee is the part of the cost that arrives first, is easiest to compare and is smallest.</p>
<p>This post has no figures in it, because the figures are yours and they vary enormously. What does not vary is the <em>shape</em> of the number. Once you know the shape, you can ask for the parts nobody volunteers.</p>
<h2 id="the-costs-that-appear-on-somebodys-invoice">The costs that appear on somebody's invoice<a class="anchor" href="#the-costs-that-appear-on-somebodys-invoice" aria-label="Link to this section">#</a></h2>
<p><strong>Implementation and configuration.</strong> Setting up your companies, sites, cost heads, item masters, tax settings, approval limits and user roles. Sometimes included, often quoted separately, occasionally quoted as an estimate that grows. Ask whether it is a fixed price or a day rate, and what happens if the work takes longer than expected.</p>
<p><strong>Data migration.</strong> This is nearly always underestimated, and the reason is not technical. It is that the old data is dirty. The same supplier exists three times with three spellings. Two item codes mean the same steel. Old balances do not tie. Somebody has to decide what dirty means and what to do with each case, and that somebody must be from your side, because only your side knows which of the three spellings is the real vendor. Budget for your own people's time, not just the vendor's.</p>
<p><strong>Training, and retraining.</strong> The first round is planned. The second is not. Site staff turn over, particularly after a season, and a system nobody was taught is a system that gets bypassed. Ask what a training session costs after the implementation period ends, because you will buy several.</p>
<p><strong>The per-user question.</strong> Ask early what a user costs, and then ask a different question: what does it cost to put the storekeeper, the gate guard, the site engineer and the supervisor on it. A per-user price is a tax on getting the record from the place it actually happens. It pushes you towards shared logins, which destroy the audit trail, or towards paper at the gate typed up later in the office, which is the failure the software was bought to fix. Ask whether there is a lighter, cheaper class of user for people who only record events.</p>
<p><strong>The people who now do data entry that did not exist before.</strong> Every system creates keystrokes. If the answer to the per-user question is bad, some of those keystrokes are done by a new person in the office whose entire job is retyping what the site wrote on paper. That is a permanent salary caused by a pricing model.</p>
<p><strong>Integration.</strong> Accounts, banking, attendance, whatever else you already run. Ask what is included, what is a one-time build, and who maintains it when either side changes.</p>
<p><strong>The annual increase.</strong> Almost every agreement has one, and it compounds quietly for the entire life of the system.</p>
<p><strong>The cost of leaving.</strong> Extraction, cleaning the extract, loading it elsewhere, and running two systems for a period. This is invisible at purchase and it is the reason people stay with tools they dislike, so it deserves a question at the start rather than at the end — the tests are in <a href="https://be-teck.com/blog/getting-your-data-back-out/">getting your data back out</a>.</p>
<h2 id="the-costs-nobody-invoices">The costs nobody invoices<a class="anchor" href="#the-costs-nobody-invoices" aria-label="Link to this section">#</a></h2>
<p>These are larger than the ones above and they never appear in a comparison.</p>
<p><strong>The parallel register nobody stopped keeping.</strong> If the notebook at the gate is still being filled, you are paying for the record twice: once in licence fees and once in the storekeeper's evening. Worse, you now have two histories of the same events, and when they disagree the argument costs a day. This is the single clearest signal of a failed adoption, and why it belongs in <a href="https://be-teck.com/blog/choosing-construction-software/">how to choose construction software</a>.</p>
<p><strong>The process bent to fit the software.</strong> A system that cannot express a disputed quantity teaches the office to record undisputed ones. A system that cannot hold a short delivery teaches the storekeeper to accept the full figure and telephone about the shortage. Nothing is invoiced. You simply have a slightly less honest archive from that month onwards, and you find out during a dispute two years later.</p>
<p><strong>A slow screen multiplied.</strong> Take the commonest transaction in your office and count how many times a day it happens across all sites. Now add ten seconds to it. That number is a salary, and it recurs every year, and it never appears in any comparison because nobody measured the screen.</p>
<p><strong>Support you cannot reach at the hour you need it.</strong> A lorry at the gate at nine in the evening is not a business-hours problem.</p>
<h2 id="how-to-ask-about-all-this">How to ask about all this<a class="anchor" href="#how-to-ask-about-all-this" aria-label="Link to this section">#</a></h2>
<p>Three requests, all reasonable, all in writing.</p>
<ol><li><strong>A three-year total, itemised.</strong> Licence, implementation, migration, training, integration, support, and every one-time item named separately. Not a monthly figure. Vendors quote per month because it is small; you are buying three years at least.</li><li><strong>What the renewal increase has been for existing customers.</strong> Not the cap in the contract — the actual history. A vendor who will not answer this has answered it.</li><li><strong>What it costs to add a person for one month at a peak.</strong> Construction is seasonal and lumpy. If adding fifteen temporary users for a busy quarter means an annual commitment for all fifteen, you will not add them, and the record will be made on paper instead.</li></ol>
<p>One more worth asking, though it rarely has a clean answer: what is the price if we double our sites, and is that in writing anywhere.</p>
<h2 id="what-actually-decides-the-return">What actually decides the return<a class="anchor" href="#what-actually-decides-the-return" aria-label="Link to this section">#</a></h2>
<p>Not the feature set. Adoption.</p>
<p>A tool that costs more and is used by everyone at the gate produces a complete record. A cheaper tool used by three people in the head office produces a partial one, and a partial record is not proportionally useful — it is a record you cannot trust anywhere, because you never know which events are missing.</p>
<p>So the money question and the legibility question are the same question. If the storekeeper cannot read the screen, no licence price is cheap, which is the argument in <a href="https://be-teck.com/blog/software-your-staff-can-read/">software your staff can read</a>. And the only honest way to find out whether people will use it is a trial designed so that they might not — <a href="https://be-teck.com/blog/a-pilot-that-tells-you-something/">a pilot that tells you something</a>.</p>
<p>Say it plainly to whoever is comparing quotations: the cheapest tool that is used beats the best tool that is not.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The licence is the visible part of a number whose larger parts are migration, training, per-user pricing and leaving. Ask for a three-year itemised total, the real renewal history, and the cost of one extra person for one month.</p>
<p>Then price the things nobody invoices — the parallel register, the bent process, the slow screen — and remember that adoption, not features, decides whether any of it was worth spending.</p>]]></content:encoded></item>
<item><title>Getting your data back out</title><link>https://be-teck.com/blog/getting-your-data-back-out/</link><guid isPermaLink="true">https://be-teck.com/blog/getting-your-data-back-out/</guid><pubDate>Tue, 01 Sep 2026 20:25:00 +0530</pubDate><description>Every system ends. A report is not an export and an export is not a backup, and the difference decides what you are holding on the day you leave.</description><category>choosing-software</category><category>records</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every system you buy will end.</p>
<p>The vendor is acquired and the product is folded into something else. The price changes and the new one does not suit you. The product is discontinued. Or you simply outgrow it, and the thing that fitted one site cannot hold nine.</p>
<p>None of these are unlikely. The only question worth asking at purchase is what you will be holding on that day.</p>
<h2 id="three-things-people-confuse">Three things people confuse<a class="anchor" href="#three-things-people-confuse" aria-label="Link to this section">#</a></h2>
<p><strong>A report</strong> is a view, arranged for a human being to read. It answers a question you already had, in a layout somebody designed, usually as a PDF. It is not data. It cannot be loaded into anything else, it shows the current state rather than the history, and it contains only the columns the designer thought you would want.</p>
<p><strong>An export</strong> is structured rows, in a machine-readable format, that another system can be made to read. This is the minimum thing you need.</p>
<p><strong>A backup</strong> is everything, including the things no report shows: the audit trail, deleted and superseded records, the internal identifiers that link one record to another, and the attachments. A backup is usually taken for the vendor's benefit, not yours, and often cannot be restored anywhere except their own software. Ask which of the three you are being offered, because all three are sometimes described with the same word.</p>
<h2 id="what-a-real-export-must-contain">What a real export must contain<a class="anchor" href="#what-a-real-export-must-contain" aria-label="Link to this section">#</a></h2>
<p>Five things. An export missing any of them is a partial record, and a partial record loses arguments.</p>
<ul><li><strong>Every record, not just the current state.</strong> If a rate was revised, a quantity corrected, a bill cancelled and reissued, all of it must come out. A snapshot of today tells you what you believe now, not what you did. The reason that matters is the whole argument of <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>.</li><li><strong>Attachments as files.</strong> The challan photographs, the signed work orders, the site photographs, the scanned bills. As actual files, in folders, named in a way that ties them back to the record. Not as web links into a system you no longer have an account on.</li><li><strong>The audit trail.</strong> Who did what, when, and what the value was before. Six months after you leave, this is what answers a dispute about a quantity, and it is the part most often missing — <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a> sets out what a usable one contains.</li><li><strong>The links between records.</strong> Which receipt belongs to which order, which invoice to which receipt, which payment to which invoice. Two spreadsheets with no shared identifier between them are not a record of a purchase; they are two lists that happen to be about similar things.</li><li><strong>The code lists.</strong> Vendor masters, item masters, cost heads, site codes, units of measure, approval roles. Without them the export is full of codes that mean nothing. A column of numbers where the item names should be is technically an export and practically waste paper.</li></ul>
<h2 id="test-it-during-evaluation-not-at-exit">Test it during evaluation, not at exit<a class="anchor" href="#test-it-during-evaluation-not-at-exit" aria-label="Link to this section">#</a></h2>
<p>Every one of these is easy to check while somebody still wants your business, and impossible to check afterwards.</p>
<p><strong>Ask for an export on day one of the pilot.</strong> Not at the end. Day one, when there are ten records in the system, so you can read the file by eye and see exactly what did and did not come out. Then open it. Actually open it, in whatever your accounts team uses, and see whether the dates survived, whether the decimals survived, and whether the vendor names came out as names.</p>
<p><strong>Check whether an attachment is a file or a link.</strong> Download the export, disconnect from the internet, and try to open one photograph. If it opens, it is a file. If it does not, you are holding a pointer to somebody else's server.</p>
<p><strong>Check whether a deleted or superseded record appears.</strong> Cancel a document during the trial, then export. If the cancelled document is absent, the export is a picture of the present, and every correction you ever made has been quietly dropped from your history.</p>
<p><strong>Time it.</strong> Ask how long an export of a full year takes, and whether it can be run by you or only by their support desk on request. An export you have to ask for is an export you will not get during a disagreement.</p>
<h2 id="contract-points-worth-insisting-on">Contract points worth insisting on<a class="anchor" href="#contract-points-worth-insisting-on" aria-label="Link to this section">#</a></h2>
<p>In plain words, no drafting language. Four points, and any reasonable vendor will agree to all four.</p>
<ol><li><strong>Export available at any time, without asking.</strong> A button you can press, not a favour. The moment you most need your data is the moment relations are worst.</li><li><strong>A defined format.</strong> Named in the agreement — the file types and, ideally, that it includes attachments and history. "Data will be provided in a mutually agreed format" means nothing on the day.</li><li><strong>A defined period after termination.</strong> A stated number of days during which you can still retrieve everything, even if the subscription has lapsed and even if there is a payment dispute. Fix the length yourself; do not accept silence.</li><li><strong>No fee for your own data.</strong> An extraction charge is a hostage fee, and the time to refuse it is before signing, not after.</li></ol>
<p>One more thing belongs in the same conversation, though it is not a contract point: what happens if the vendor simply goes quiet, as small companies do. Whether you can retrieve your own data without their help decides whether that is an inconvenience or a catastrophe. The cost of ignoring all of this is a large part of <a href="https://be-teck.com/blog/the-real-cost-of-software/">what a price list does not tell you</a>.</p>
<h2 id="documents-that-must-survive-the-system">Documents that must survive the system<a class="anchor" href="#documents-that-must-survive-the-system" aria-label="Link to this section">#</a></h2>
<p>One category deserves separate attention: anything that was signed.</p>
<p>A work order, a measurement sheet, an approved bill, a handover certificate. A signature stored as a flag in a database — a column saying <em>approved by</em> — is worth nothing once the database is gone. What you need is a document that can be checked on its own, by someone with no login, using only the file itself. That property is the subject of <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident documents</a>, and it is worth asking about at evaluation, because it cannot be added afterwards to documents already signed.</p>
<p>Ask the vendor a direct question: if I export a signed work order today and open it in five years on a machine that has never heard of you, can anybody tell whether it has been altered. The answer separates a signature from a picture of one.</p>
<p>We took that question seriously enough to answer it in our own work. A sealed work order carries on <strong>every</strong> page its number, <em>page N of M</em>, a fingerprint of the file, and a QR code. The page that QR reaches needs no sign-in and states only that the true document has exactly that many pages, its fingerprint, the date it was sealed and who issued it — no amounts, no contents. A vendor, an auditor or a bank clerk holding the paper can check it, and it goes on working whether or not anybody still has an account with us.</p>
<p>All of this belongs in the evaluation itself, alongside the other axes in <a href="https://be-teck.com/blog/choosing-construction-software/">how to choose construction software</a>. Exit is not a pessimistic subject. It is the only one that is guaranteed to come up.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A report is for reading, an export is for moving, a backup is for the vendor. Insist on an export that carries history, attachments as files, the audit trail, the links between records and the code lists.</p>
<p>Test all of it in the first week of the trial, while somebody still wants your signature. And make sure anything signed can be verified without the system it came from.</p>]]></content:encoded></item>
<item><title>Ask to see the audit trail before you sign</title><link>https://be-teck.com/blog/ask-to-see-the-audit-trail/</link><guid isPermaLink="true">https://be-teck.com/blog/ask-to-see-the-audit-trail/</guid><pubDate>Tue, 01 Sep 2026 20:20:00 +0530</pubDate><description>Every vendor says the history is kept. The way to find out is to make a record, change it, cancel it, and ask to see that one record's history on screen.</description><category>choosing-software</category><category>records</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Ask a vendor whether the system keeps an audit trail and the answer is always yes. It costs nothing to say, and it is almost never tested, because a demo is built to show work being done rather than work being questioned.</p>
<p>This is the question that separates a system of record from a data-entry screen. A data-entry screen holds what is true now. A system of record holds what was true then, and who said so, and when.</p>
<h2 id="why-the-question-gets-skipped">Why the question gets skipped<a class="anchor" href="#why-the-question-gets-skipped" aria-label="Link to this section">#</a></h2>
<p>Demos run forward. Raise an indent, approve it, cut an order, receive the material, pay the bill. Every person in the story does the right thing the first time.</p>
<p>Nothing in a demo shows somebody changing their mind at nine at night, or being asked eleven months later why a rate moved between one Tuesday and the next. That is the day the trail matters, and it is not a day anybody is thinking about while buying. It belongs with the rest of <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a> and it is the item most often left off.</p>
<p>The other reason is that buyers ask about features. A trail is not a feature you use; it is evidence you hold. Nobody demonstrates evidence.</p>
<h2 id="the-test-in-order">The test, in order<a class="anchor" href="#the-test-in-order" aria-label="Link to this section">#</a></h2>
<p>Ask for the keyboard. Then, on the system's main document — a purchase order, a work order, an indent, whatever money eventually follows:</p>
<ol><li><strong>Create it.</strong> As an ordinary user, with an ordinary user's permissions.</li><li><strong>Approve it.</strong> As the second person, if there is an approval step.</li><li><strong>Change it.</strong> Change something that matters — a rate, a quantity, the vendor.</li><li><strong>Cancel it.</strong> Or reject it, or void it, whatever the word is here.</li><li><strong>Ask to see the history of that one record.</strong> On screen. Logged in as a normal user of that document, not as the vendor's administrator, and not as a query their engineer runs on a laptop turned slightly away from you.</li></ol>
<p>Step five is the entire test. The data almost certainly exists somewhere. The question is whether a person who is not a programmer can reach it in the middle of a disagreement, without anybody's permission.</p>
<h2 id="what-to-look-for-on-that-screen">What to look for on that screen<a class="anchor" href="#what-to-look-for-on-that-screen" aria-label="Link to this section">#</a></h2>
<ul><li><strong>Who.</strong> A named person. Not <code>system</code>, not <code>admin</code>, not blank.</li><li><strong>When.</strong> A date and a time, and some indication of where the time came from.</li><li><strong>What it was before.</strong> "Rate changed" is not a record. The old value and the new one, side by side, is a record.</li><li><strong>From where.</strong> Web or phone, office or site, typed or imported. A bulk import that rewrote the whole rate list should not look identical to a storekeeper correcting one line.</li><li><strong>Whether the history itself can be edited.</strong> Look for an edit or delete control on the trail. Try to use it.</li><li><strong>What a deletion leaves.</strong> Delete the record. Does its history survive, with a line naming who deleted it, or does the whole thing stop existing.</li><li><strong>Whether it covers more than fields.</strong> Attachments added and removed, approvals given and withdrawn, comments, status changes.</li></ul>
<p>Two more have to be tried rather than asked. Open a record somebody <em>else</em> created and look for the same screen: some systems show you your own history and nobody else's, which is precisely backwards — your own actions are the ones you already remember.</p>
<p>And get it out. Ask for the trail of one record as a file you keep. If the only way history escapes the software is a screenshot, you own the reading of it and not the record.</p>
<h2 id="the-questions-about-the-vendors-own-people">The questions about the vendor's own people<a class="anchor" href="#the-questions-about-the-vendors-own-people" aria-label="Link to this section">#</a></h2>
<p>This is the set that gets a longer pause.</p>
<p><strong>What can support see?</strong> Most hosted systems let the vendor's staff view customer data, and usually that is how a problem gets fixed. That is reasonable. Not knowing is not.</p>
<p><strong>Can they log in as me?</strong> Impersonation is a normal support tool. Ask whether it exists, who may use it, and whether it is announced.</p>
<p><strong>Is their access in the trail I can read</strong>, or in a separate log only they can produce?</p>
<p><strong>Can they change data directly?</strong> A correction, a data fix, a migration run against your database. Ask what that looks like afterwards.</p>
<p>Press hardest on the last one. A support fix that appears in the history under a storekeeper's name is worse than no history at all: a false record carrying a real person's name, and that person is the one who will be asked to explain it.</p>
<h2 id="how-long-it-is-kept-and-what-happens-when-it-is-trimmed">How long it is kept, and what happens when it is trimmed<a class="anchor" href="#how-long-it-is-kept-and-what-happens-when-it-is-trimmed" aria-label="Link to this section">#</a></h2>
<p>Trails grow faster than the records they describe, so every system eventually trims, archives or rolls up. Ask how long entries live, what is dropped first, and whether you are told when it happens.</p>
<p>Then check that answer against the life of your disputes. Construction records get questioned at final account, at an assessment, at a handover, sometimes years after the site closed. A short retention period is not wrong, but you should choose it knowingly rather than discover it.</p>
<h2 id="backups-are-not-an-answer-to-this">Backups are not an answer to this<a class="anchor" href="#backups-are-not-an-answer-to-this" aria-label="Link to this section">#</a></h2>
<p>A backup is a copy of everything the system believed at one moment. It answers <em>can the data be recovered after a disaster</em>. It does not answer <em>who changed this, when, and what was it before</em>.</p>
<p>To use a backup as history somebody must restore an old copy somewhere, find the same record and compare by eye. Even then the answer is "it was different last month", not "this person changed it from the site office, and here is the value they replaced". Backups protect data. A trail explains it. Only one of them settles an argument.</p>
<p>The discipline underneath — that a correction adds a line rather than replacing one — is set out in <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>. The same logic applied to documents rather than fields gives you <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident paperwork</a>.</p>
<h2 id="a-trail-nobody-can-read-during-an-argument-does-not-exist">A trail nobody can read during an argument does not exist<a class="anchor" href="#a-trail-nobody-can-read-during-an-argument-does-not-exist" aria-label="Link to this section">#</a></h2>
<p>The dispute you are buying insurance against has a shape. Two accounts of the same event disagree, somebody is being blamed, a payment is held.</p>
<p>In that room a trail is only useful if the person in the argument can produce it in minutes, on their own, from a screen. If producing it needs a support ticket, a vendor's engineer and two working days, then in every dispute that actually happens, you do not have one.</p>
<p>That is also the difference between a trail that protects the organisation and one that protects the person who decided; <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a> argues the second is why people keep the first honestly.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Make a record, approve it, change it, cancel it, then ask to see that one record's history on screen as an ordinary user. Check who, when, the previous value, and whether the trail itself can be edited.</p>
<p>Ask what the vendor's staff can see and do, and whether that sits in the history you can read. Backups are not history. A trail that takes two days and a support ticket to produce is a trail you do not have.</p>]]></content:encoded></item>
<item><title>How to test a "works offline" claim in ten minutes</title><link>https://be-teck.com/blog/evaluating-offline-claims/</link><guid isPermaLink="true">https://be-teck.com/blog/evaluating-offline-claims/</guid><pubDate>Tue, 01 Sep 2026 20:15:00 +0530</pubDate><description>Every vendor says the app works offline, and the word means four different things. A cheap phone in flight mode settles it faster than any meeting.</description><category>choosing-software</category><category>field</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Ask any vendor whether the app works offline and the answer is yes. Nobody is lying. The word covers four different behaviours, and only two of them are what a site in a basement, a cellar or a shed behind the batching plant actually needs.</p>
<p>The good news is that you can tell them apart on a phone, in about ten minutes, in front of the person selling it to you. Of everything on the list when <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a>, this is among the few claims a buyer can check without trusting anyone.</p>
<h2 id="the-four-things-offline-turns-out-to-mean">The four things "offline" turns out to mean<a class="anchor" href="#the-four-things-offline-turns-out-to-mean" aria-label="Link to this section">#</a></h2>
<ul><li><strong>It shows what you already loaded.</strong> A cache. Read-only. Open the app in a dead spot and this morning's list is still on the screen. Genuinely useful, and often the whole of what is being claimed.</li><li><strong>It lets you type, and then loses it.</strong> The form accepts input, the save spins or fails quietly, and a refresh or a force-close takes the entry with it. This is the common one, and it is worse than a plain refusal, because the storekeeper walks away believing the entry was made.</li><li><strong>It queues the entry and sends it later.</strong> The record is written to the phone, held, and pushed when signal returns. This is what most people mean when they say offline, and what a competent implementation does.</li><li><strong>It holds a working copy and reconciles.</strong> The device carries real data, can be worked on all day, and merges back afterwards with rules for what happens when two copies disagree. Rare, expensive, and only worth it for some kinds of work.</li></ul>
<p>Ask which one it is. Then test it, because the answer given in a meeting and the behaviour of a phone in a lift shaft are different things.</p>
<h2 id="the-ten-minute-test">The ten-minute test<a class="anchor" href="#the-ten-minute-test" aria-label="Link to this section">#</a></h2>
<p>Use a real phone, not the vendor's laptop with the wifi switched off. Preferably a cheap phone of the kind your site actually carries. It is the most valuable ten minutes available in a demo, and <a href="https://be-teck.com/blog/how-to-run-a-software-demo/">how to run a software demo</a> is largely an argument for spending time this way.</p>
<ol><li><strong>Flight mode first, then open the app.</strong> This order matters more than everything else here. Most apps survive losing signal after they have loaded. Far fewer survive being started cold with no network, and cold is the real case: a phone that has been in a pocket since morning was shut down by the operating system hours ago.</li><li><strong>Open a record you have not looked at today.</strong> Last week's material issue, another site's list. This separates a real local copy from a cache of whatever happened to be on screen.</li><li><strong>Create a record with a photograph.</strong> Photographs are where offline claims break. An image is large, and the queue that handles a line of text cheerfully is usually not the same queue.</li><li><strong>Force-close the app.</strong> Swipe it away properly, do not just go to the home screen.</li><li><strong>Reopen it, still offline.</strong> Is the entry there. Does the screen say what state it is in, or does it look identical to a saved record.</li><li><strong>Come back online and watch.</strong> How long before it goes. Whether anybody is told. Whether the record ends up carrying the right time.</li></ol>
<h2 id="what-to-ask-once-you-know-what-it-does">What to ask once you know what it does<a class="anchor" href="#what-to-ask-once-you-know-what-it-does" aria-label="Link to this section">#</a></h2>
<p><strong>What happens if two people edited the same record offline?</strong> Uncommon on attendance, routine on a measurement sheet or a snag list. The system can take the last writer, keep the first, or hold both and ask a person. Any of the three can be defended. Not knowing cannot.</p>
<p><strong>Whose clock is on the record?</strong> The phone's or the server's. These mean different things. A server timestamp records when the data arrived, which may be hours after the man stood at the gate. A phone timestamp records the event but trusts a device that somebody is holding.</p>
<p><strong>What happens when the phone's clock is wrong?</strong> More common than people expect: a factory reset, a dead battery, a handset that has not seen a network to sync from in weeks. Ask whether the system notices the skew and what it does. An entry dated next month is easy to spot. One dated slightly early is not, and it will sit in the record looking perfectly ordinary.</p>
<p><strong>How large can the queue get?</strong> Ask for the limit and what happens at it. Does the oldest entry fall off, does the app refuse new ones, or does it grow until the phone complains. A supervisor through a shutdown with no signal is not a hypothetical.</p>
<p><strong>What does the user see when a queued item fails to send?</strong> Not whether it retries — everything retries. What the person sees when retrying stops working: a rejection from the server, a login that expired while they were offline, a record somebody else deleted in the meantime. If the answer is a silent drop, the system will lose entries and nobody will know which ones.</p>
<h2 id="offline-changes-what-the-record-means">Offline changes what the record means<a class="anchor" href="#offline-changes-what-the-record-means" aria-label="Link to this section">#</a></h2>
<p>This is the part that outlives the buying decision.</p>
<p>A record made offline was created by a device nobody was watching, at a time nobody can independently verify, and checked against rules the device could not run. Some checks simply cannot happen on a phone with no network. Is this material still in stock. Is this man still on the roll. Has this order already been received against.</p>
<p>So the software has two options and both cost something. Let the entry through and validate it later, which means some entries get rejected after the fact and somebody has to be shown them. Or refuse, in which case the app does not work offline for exactly the cases that matter.</p>
<p>Which of those it chose, and where the rejected entries surface, is the real question underneath the demo. It is worked through in <a href="https://be-teck.com/blog/offline-first-is-a-data-decision/">offline-first as a data decision</a>. Attendance is the sharpest version of it, because the record is about a person and money follows it a fortnight later, and <a href="https://be-teck.com/blog/attendance-without-signal/">attendance on a site with no signal</a> covers the duplicate punch and the clock in more detail.</p>
<h2 id="the-two-rules-we-hold-ourselves-to">The two rules we hold ourselves to<a class="anchor" href="#the-two-rules-we-hold-ourselves-to" aria-label="Link to this section">#</a></h2>
<p><strong>A queued record obeys the same rules as a live one.</strong> A punch made on a phone with no signal goes through exactly the same validation, when it finally arrives, as one made in the office on a browser. Not a lenient path for the offline case — the same path. The moment a rule has two implementations, the offline one drifts, and it drifts quietly, because nobody is watching the device that produced it.</p>
<p><strong>What a phone volunteers is not evidence.</strong> Our app can sample location in the background, and not one of those samples counts toward whether somebody was present, or which site they worked at. Presence is a deliberate act by a person. A location fix is a fact about a handset, and the two are not interchangeable however convenient it would be.</p>
<p>Ask a vendor both questions in those words. The first tells you whether the offline path is real. The second tells you what they think a record is.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Offline means four things: it caches, it loses your typing, it queues, or it reconciles. Ask which, then take a cheap phone, switch on flight mode before opening the app, open something you have not viewed today, make a record with a photograph, force-close it, reopen it, and come back online.</p>
<p>Then ask about conflicts, clocks, queue limits and failed sends. A record made offline is a weaker claim about the world than one made online. The question is not whether it arrives. It is what it means when it does.</p>]]></content:encoded></item>
<item><title>Software your staff can actually read</title><link>https://be-teck.com/blog/software-your-staff-can-read/</link><guid isPermaLink="true">https://be-teck.com/blog/software-your-staff-can-read/</guid><pubDate>Tue, 01 Sep 2026 20:10:00 +0530</pubDate><description>The storekeeper, the guard and the munshi have to use it too. What Hindi support usually turns out to mean, and how to find out before you buy.</description><category>choosing-software</category><category>interface</category><category>design</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The people who will use a construction system every day are not the people sitting in the demo. The storekeeper who books material in, the guard at the gate, the site supervisor logging a pour, the labour contractor's munshi marking a muster — these are the users. The head office team who chose the software will touch it far less often than any of them.</p>
<p>So the question is not whether the application is usable. It is whether it is usable by the specific people in your organisation, on the phones they own, in the language they read. It is the easiest question to skip when <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a>, because everybody in the room can read English.</p>
<h2 id="what-hindi-support-usually-means">What "Hindi support" usually means<a class="anchor" href="#what-hindi-support-usually-means" aria-label="Link to this section">#</a></h2>
<p>Every vendor selling in India will say yes to Hindi. The word covers a wide range, and the range is worth naming.</p>
<ul><li><strong>The menus only.</strong> Navigation and button labels translated; every screen behind them still in English. This is the most common version by a distance.</li><li><strong>Menus and labels, but not messages.</strong> The form is in Hindi until something goes wrong, at which point the failure appears in English. The user meets the translation on the easy path and loses it on the hard one.</li><li><strong>Static text, but not data.</strong> Everything the developer typed is translated; nothing anybody typed into the system is. Material names, unit names and status names stay as they were entered.</li><li><strong>The whole application, in a register nobody speaks.</strong> Complete, formal, and translated by somebody who has never stood in a site store. The words are Hindi and the sentences are not.</li></ul>
<p>Ask which of these it is, then check, because nobody answers it precisely without being pressed.</p>
<h2 id="how-to-test-the-language-claim">How to test the language claim<a class="anchor" href="#how-to-test-the-language-claim" aria-label="Link to this section">#</a></h2>
<p>Switch the language yourself, then go looking for the seams.</p>
<p><strong>Break something on purpose.</strong> Save a form with a required field empty. Enter a quantity larger than the stock. Try to approve something you are not allowed to approve. The error message is where translations end, and an error message in English is the one message that most needed to be understood.</p>
<p><strong>Look at the dates and the numbers.</strong> A date shown in a form the reader does not use gets read wrongly at least sometimes. Check whether large figures are grouped the way your office writes them, and whether units appear as words your storekeeper uses or as codes from a table.</p>
<p><strong>Read the register, not just the words.</strong> This is the part almost nobody checks and the part staff notice immediately. Hindi has a respectful form and a familiar one. Software written in bare imperatives — the form you would use with a child — reads as an order barked at somebody, and people resent an application that talks down to them in a way they would never accept from a colleague. The respectful form costs nothing and changes how the thing feels to use.</p>
<p><strong>Check the vocabulary against the site.</strong> A translation can be correct and still useless, because the official word for a thing and the word the store shouts across the yard are different words. Somebody looking for a bilty will not find a screen labelled with the formal term for it. That is a deeper problem than translation, and <a href="https://be-teck.com/blog/the-words-the-site-already-uses/">the words the site already uses</a> shows where it decides behaviour.</p>
<p><strong>Find out who can switch.</strong> If changing language needs an administrator, nobody changes it. A user who cannot set their own language is using whatever the person who created their account happened to pick.</p>
<h2 id="reading-is-not-only-about-language">Reading is not only about language<a class="anchor" href="#reading-is-not-only-about-language" aria-label="Link to this section">#</a></h2>
<p>A large part of "can they read it" has nothing to do with which language it is in.</p>
<p><strong>Sunlight.</strong> Take the phone outside at noon and look at the screen. Thin grey text on white, which looks elegant in an office, disappears entirely on a roof slab. So does a low-contrast placeholder that turns out to be the only label on a field. Contrast is not decoration.</p>
<p><strong>Capital letters.</strong> A screen set in capitals reads as deliberate for a week and as shouting after that, and it is slower going for anybody who is not a confident reader — the argument in <a href="https://be-teck.com/blog/capitals-are-a-contrast/">capitals are a contrast</a>.</p>
<p><strong>Tap targets.</strong> The hand using this has been working. It is dusty, it may be gloved, the phone may be wet. Small controls placed close together are a source of wrong entries, not merely of irritation.</p>
<p><strong>Taps per action.</strong> Count them for the commonest task in the building — the one done all day, not the one demonstrated. Every extra tap is multiplied by however many times that job happens, and the gap between a short sequence and a long one decides whether the system gets used or worked around.</p>
<p><strong>Number entry.</strong> Watch somebody enter a quantity. If the keyboard opens on letters, if the decimal point is buried, if the field rejects a comma the way the user writes it, that field will be filled in wrongly and the errors will look like carelessness rather than design.</p>
<p><strong>Explanations.</strong> When the app refuses something, does it say why. A refusal with no reason teaches the user that the software is arbitrary, and arbitrary things get routed around; <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a> adds that the reason must reach the reader in their own language too.</p>
<h2 id="the-person-who-cannot-read-comfortably">The person who cannot read comfortably<a class="anchor" href="#the-person-who-cannot-read-comfortably" aria-label="Link to this section">#</a></h2>
<p>Some of the people who will use this are not confident readers in any language. This is ordinary and it is planned for badly.</p>
<p>Ask what a task looks like without reading. Whether the material can be chosen by photograph as well as by name. Whether a status is carried by shape and colour and not only by a word. Whether a note can be spoken instead of typed, and what happens to that recording afterwards. Whether the flow of the screen matches the order of the physical job, so that a person can follow the shape of it from memory.</p>
<p>Where none of that exists the work does not stop, it moves. It goes to a call, or to somebody at the head office typing on behalf of a man at the gate, or to a group chat — which is why <a href="https://be-teck.com/blog/whatsapp-is-the-interface/">WhatsApp is the interface</a> whether anybody designed for it or not.</p>
<h2 id="three-things-we-changed-in-ours">Three things we changed in ours<a class="anchor" href="#three-things-we-changed-in-ours" aria-label="Link to this section">#</a></h2>
<p><strong>Language is a setting on a person, not a policy for a company.</strong> Automated messages go out in each person's own language rather than in one chosen for everybody. Two people on the same site can receive the same fact differently and both understand it.</p>
<p><strong>The words people reply with are not translated.</strong> A short reply the system matches on stays identical in both languages, because it is a command rather than prose. Translating it would break the one thing the person had memorised.</p>
<p><strong>The screen at a gate should not need a language at all.</strong> It uses pictograms and large plain numerals beside Devanagari, so somebody who reads neither language can still work it.</p>
<h2 id="the-test-that-settles-it">The test that settles it<a class="anchor" href="#the-test-that-settles-it" aria-label="Link to this section">#</a></h2>
<p>Hand the phone to the person who will actually use it. Say nothing.</p>
<p>Do not explain the screen, do not point, do not fill the silence. Give them the real task — book in this load, mark this man present — and watch where they stop. Where they stop is the answer, and it is usually not where anyone in the room expected.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Ask exactly how much of the application is translated, then break something and see what language the error is in. Check the register: respectful forms, and the words the site already uses.</p>
<p>Take the phone into the sun, count the taps for the commonest task, and watch somebody type a number. Then hand it to the storekeeper and stay quiet.</p>]]></content:encoded></item>
<item><title>Approval chains worth asking about</title><link>https://be-teck.com/blog/approval-chains-worth-asking-about/</link><guid isPermaLink="true">https://be-teck.com/blog/approval-chains-worth-asking-about/</guid><pubDate>Tue, 01 Sep 2026 20:05:00 +0530</pubDate><description>Every vendor can draw a workflow diagram. The questions that separate a real approval system from a picture are about the cases nobody draws.</description><category>choosing-software</category><category>how-we-work</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every system has an approvals screen, and every vendor can draw the diagram: raised, checked, approved, released. Boxes and arrows are cheap.</p>
<p>What separates a working control from a picture of one is the set of cases the diagram does not draw — the approver on leave, the amount that changes after the chain started, the person who is both raiser and signatory. Spend the meeting on those. They belong high on the list when <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a>.</p>
<h2 id="what-the-chain-has-to-be-able-to-depend-on">What the chain has to be able to depend on<a class="anchor" href="#what-the-chain-has-to-be-able-to-depend-on" aria-label="Link to this section">#</a></h2>
<p>Start with the conditions. Ask whether a chain can vary by the amount, by the project, by the category of spend, and by who raised it.</p>
<p>Most systems do one. Your actual rule is all four at once: a purchase above a figure, on a particular site, in a category with an annual rate contract, raised by somebody who joined last month. If the software supports one dimension, the other three are enforced by somebody remembering, which means they are not enforced.</p>
<p>Then the follow-up that catches people. <strong>What happens when the value changes after the chain has started?</strong> An order raised below a threshold and then edited above it should re-enter the higher chain. A surprising number of systems keep it where it was, and the amount that needed the extra signature is precisely the amount that got fewer.</p>
<h2 id="who-may-change-the-chain">Who may change the chain<a class="anchor" href="#who-may-change-the-chain" aria-label="Link to this section">#</a></h2>
<p>The chain is itself a control, and a control any administrator can quietly rewrite is not one.</p>
<ul><li><strong>Who can edit it.</strong> Not "an admin". Which named role, and how many people hold it today.</li><li><strong>Is the change itself approved?</strong> A control that changes without a second person agreeing is a control with a back door.</li><li><strong>Is the change recorded?</strong> Old chain, new chain, who, when. Without it nobody can explain why a March document took a different route from an April one.</li><li><strong>What happens to items already in flight?</strong> Do they follow the chain they entered or the chain as it now stands. Both are defensible. Silence is not.</li></ul>
<h2 id="the-questions-about-people">The questions about people<a class="anchor" href="#the-questions-about-people" aria-label="Link to this section">#</a></h2>
<p><strong>What happens when an approver is on leave?</strong> Three honest answers exist: it waits, somebody else may act, or it escalates on a clock. Ask which. Then ask whether a delegation carries an end date, whether the person raising the request can see it is in force, and whether the record names who actually approved rather than who the chain nominally names.</p>
<p>A delegation with no end date becomes permanent, and that is how one person quietly acquires the authority of three. A permission with a clock on it is the safe shape, and <a href="https://be-teck.com/blog/who-is-allowed-to-decide/">who is allowed to decide</a> argues most organisations cannot state their own answer here.</p>
<p><strong>Can somebody approve their own request?</strong> Test it rather than asking. Raise something as a person who also holds an approval and see whether the button is there. Then the harder versions: raise it in somebody else's name and approve it, or raise it, have it rejected, edit it, and approve the edited version yourself.</p>
<p><strong>On money, is there a second signature, and can it be the same person twice?</strong> A two-step chain where one person holds both steps is one signature drawn twice. That erosion happens by convenience, not by intent — the subject of <a href="https://be-teck.com/blog/two-signatures-on-money/">two signatures on money</a>.</p>
<h2 id="what-the-approver-sees-at-the-moment-of-deciding">What the approver sees at the moment of deciding<a class="anchor" href="#what-the-approver-sees-at-the-moment-of-deciding" aria-label="Link to this section">#</a></h2>
<p>This gets the weakest answers, and it decides whether the chain does any work at all.</p>
<p>At the instant the approve button is pressed, what is on the screen? A title and an amount is a rubber stamp with extra steps. What ought to be there:</p>
<ul><li><strong>The document itself</strong>, readable without opening a second system.</li><li><strong>What changed</strong> since the previous person approved it.</li><li><strong>The history</strong>, including any earlier rejection and its reason.</li><li><strong>The position on the head</strong> — what is already committed against this budget, this project, this vendor.</li><li><strong>Anything outstanding on the other side</strong> — an open dispute, an overdue balance, a quality issue not closed.</li><li><strong>What this step is for</strong>, in one sentence, so a new approver knows what to check.</li></ul>
<p>Then ask the same about the phone. Most approvals happen on a phone, between other things, and if the phone screen carries less than the desktop one, the approval that actually occurs is the shallow version.</p>
<h2 id="after-the-fact">After the fact<a class="anchor" href="#after-the-fact" aria-label="Link to this section">#</a></h2>
<p><strong>Can an approval be withdrawn?</strong> Between the approval and the order leaving the building there is usually a window. Ask whether it exists, who may use it, and whether using it leaves a line in the record.</p>
<p><strong>What happens to a record approved and then edited?</strong> This is the important one. If a rate can change after approval and the approval stays attached, the approval means nothing. Three answers are defensible: the edit is refused, the approval is voided and the chain runs again, or the edit is allowed and marked so the next person sees it. Ask which, then change a rate on an approved order and watch the screen.</p>
<h2 id="how-approval-chains-fail-in-practice">How approval chains fail in practice<a class="anchor" href="#how-approval-chains-fail-in-practice" aria-label="Link to this section">#</a></h2>
<p>They rarely fail by being wrong. They fail by being ignored.</p>
<ul><li><strong>Too many steps.</strong> Each approver assumes the others read it, so everybody signs. A few steps genuinely read catch more than many that are not.</li><li><strong>A step whose owner does not know what they are checking.</strong> Ask an approver what they look for. If the answer is "that it is correct", that step is a delay wearing the costume of a control.</li><li><strong>The out-of-office stall.</strong> Nothing is refused. It sits, and moves when somebody rings. The commonest failure and the hardest to see, because a stalled item produces no event — <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">why tasks stall between people</a>.</li><li><strong>Escalation that needs an accusation.</strong> If moving a stuck item upward means naming a colleague, nobody moves it, and management hears of the problem only once it is unfixable; <a href="https://be-teck.com/blog/escalation-without-shame/">escalation without shame</a> designs that requirement out.</li><li><strong>The override that becomes the route.</strong> Used once for a real emergency, then for something merely urgent, then for anything raised late on a Friday. Given a year, the bypass is the process and the chain is decoration.</li></ul>
<h2 id="two-of-these-cost-us-real-work">Two of these cost us real work<a class="anchor" href="#two-of-these-cost-us-real-work" aria-label="Link to this section">#</a></h2>
<p><strong>Delegation is bounded and never lowers the floor.</strong> A stand-in is named for a window with an end date, is revocable, and cannot turn two signatures into one.</p>
<p><strong>Moving a reviewer re-addresses the review.</strong> When a task's lead changes mid-review, the new reviewer is knocked with the brief the submission carried, and the previous one is told nothing is owed. Quietly swapping queue rows leaves two people each assuming the other has it.</p>
<h2 id="what-good-looks-like">What good looks like<a class="anchor" href="#what-good-looks-like" aria-label="Link to this section">#</a></h2>
<p><strong>The fewest steps that each mean something.</strong> Every step added dilutes the attention of the ones already there.</p>
<p><strong>Every step named for what it checks</strong>, not for the rank of whoever signs. "Confirms the rate matches the contract" tells a new approver what to do; "director approval" tells them only that they are senior enough.</p>
<p><strong>Every bypass recorded rather than silent.</strong> An override that writes a line, names the person, asks a reason and appears on somebody's screen next morning stays rare. A silent one becomes the default.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Ask whether a chain can depend on amount, project, category and raiser at once, and what happens when a value changes mid-flight. Ask who may edit the chain, and what happens on leave, on self-approval and on an edit made after approval.</p>
<p>Then ask what the approver actually sees at the moment of deciding, and on a phone. Fewest steps that each mean something, every step named for what it checks, every bypass written down.</p>]]></content:encoded></item>
<item><title>One WhatsApp number, or one per person</title><link>https://be-teck.com/blog/one-number-or-many-on-whatsapp/</link><guid isPermaLink="true">https://be-teck.com/blog/one-number-or-many-on-whatsapp/</guid><pubDate>Tue, 01 Sep 2026 20:00:00 +0530</pubDate><description>Behind every WhatsApp integration is one decision nobody raises in the meeting: does the message come from the company, or from a person who knows them.</description><category>choosing-software</category><category>notifications</category><category>field</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every WhatsApp feature a builder is shown rests on a decision that is almost never discussed in the room: does the message leave from the company, or from a person?</p>
<p>Templates, buttons, delivery reports and reply handling all follow from that answer, and getting it wrong costs relationships that took years to build. It belongs on the list when <a href="https://be-teck.com/blog/choosing-construction-software/">choosing construction software</a>, not settled by whichever option the vendor happens to have built.</p>
<h2 id="the-single-company-number">The single company number<a class="anchor" href="#the-single-company-number" aria-label="Link to this section">#</a></h2>
<p>All outbound traffic leaves from one business number. Everyone who deals with you sees the same identity.</p>
<p>What that buys you:</p>
<ul><li><strong>Continuity that survives people.</strong> The number belongs to the organisation. Staff change; the thread does not.</li><li><strong>A record by default.</strong> Sent, delivered, read and kept, on the company's side of the line, without asking anybody to cooperate.</li><li><strong>One place to change things.</strong> A template edited once changes every message that follows it. One switch turns a category of traffic off.</li><li><strong>A clean ending.</strong> Somebody who has left cannot keep talking to your vendors as though they still work here.</li></ul>
<p>What it costs:</p>
<ul><li><strong>Replies land in one inbox, and somebody must route them.</strong> If nobody owns that inbox, replies disappear into it, which is worse than never inviting one.</li><li><strong>Personal continuity is lost.</strong> The vendor who has dealt with the same purchase officer for years now hears from a company, and replies to a number that does not know him.</li><li><strong>Tone flattens.</strong> A statement from a company number reads as a statement. The same words from the man he has been arguing with about rates read as a nudge between two people.</li></ul>
<h2 id="one-number-per-person">One number per person<a class="anchor" href="#one-number-per-person" aria-label="Link to this section">#</a></h2>
<p>Each person sends from the working identity the other side already has in their phone. The vendor sees a name he recognises.</p>
<p>The gains are the mirror image. A reply reaches somebody who knows the history. The recipient can ring the same number and get a human. The tone matches the relationship, so a chase lands as a chase and not as a form letter. Nothing has to be routed by anybody.</p>
<p>The costs are real and they are usually discovered late.</p>
<ul><li><strong>The organisation's conversation lives on personal handsets.</strong> When the person leaves, so does the thread, and with it the reason a rate was agreed.</li><li><strong>There is no record unless one is deliberately kept</strong>, and "deliberately kept" means somebody designed for it before the first message went out.</li><li><strong>Work and home share a screen.</strong> A supplier messages at eleven at night about a lorry, and the family group is two swipes away.</li><li><strong>Nobody can cover.</strong> On a day of leave, the vendor's message sits unread on a phone in a drawer, and the sender has no way of knowing.</li><li><strong>The number is portable.</strong> A relationship held entirely in one person's handset can be hired away.</li></ul>
<h2 id="which-traffic-belongs-to-which">Which traffic belongs to which<a class="anchor" href="#which-traffic-belongs-to-which" aria-label="Link to this section">#</a></h2>
<p>The mistake is not choosing the wrong model. It is choosing one model for everything.</p>
<p><strong>A company identity should carry</strong> the traffic that is periodic, identical in shape, or generated by the system: a price revision, a site closure, a holiday notice, statements and ledgers, an approval waiting, a document ready, a payment released. None of these need a person present, and all of them benefit from being uniform.</p>
<p>The risk on this side is volume. A company number that sends every event becomes a channel people mute, and a muted channel is worse than none, which is the argument in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<p><strong>A person should carry</strong> the traffic where the answer depends on trust rather than information. A negotiation — rates are agreed between people. A chase: <em>where is the lorry</em> from a company number is a form letter, and from the man who placed the order it is a question with somebody standing behind it. A site instruction, where the supervisor telling a contractor to stop a pour needs to be the supervisor.</p>
<p>A system that handles only the first kind does not remove the second. It pushes it onto personal phones, unrecorded, which is roughly what already happens in most offices, and why <a href="https://be-teck.com/blog/whatsapp-is-the-interface/">WhatsApp is the interface</a> whether anybody designed for it or not.</p>
<h2 id="how-we-settled-it">How we settled it<a class="anchor" href="#how-we-settled-it" aria-label="Link to this section">#</a></h2>
<p>Both, with a rule about which.</p>
<p>A person can link their own work number, and their documents and signature requests then leave from it — the vendor sees the colleague they know. Those personal lines are structurally barred from carrying company-wide announcements: a broadcast can never go out over somebody's own number, whatever anybody configures.</p>
<p>For a message to an outside number, we send from the line on which the last conversation with that number travelled. If that line cannot send, it goes from the office number and says nothing about why. A vendor need not be told which colleague was unavailable.</p>
<h2 id="the-questions-to-ask-the-vendor">The questions to ask the vendor<a class="anchor" href="#the-questions-to-ask-the-vendor" aria-label="Link to this section">#</a></h2>
<ul><li><strong>Where does a reply go?</strong> Into a shared inbox with a named owner, onto a screen inside the software, or nowhere. "Nowhere" is a real answer and it is rarely volunteered. Worse is a reply that arrives but is routed as general noise when it was actually a request, which is the failure in <a href="https://be-teck.com/blog/filed-as-chatter/">filed as chatter</a>.</li><li><strong>Is the conversation kept when the person leaves?</strong> For a company number, usually yes. For anything per-person, ask precisely what survives the handset, and ask before the first resignation rather than after.</li><li><strong>Can a person opt out, in both directions?</strong> Can a staff member decline to have their personal number used for company traffic. Can a recipient stop receiving messages, and is that honoured permanently and across every kind of message, not only the one they complained about.</li><li><strong>What happens to a personal message that lands in a business thread?</strong> Because it will. Somebody's family will message the wrong number, a vendor will send a wedding invitation. Ask whether it is stored, who can read it and whether it can be removed.</li><li><strong>What exactly is stored, and for how long?</strong> Text, attachments, numbers, delivery and read status. Read status especially, because it is a fact about a person and it will eventually be produced in an argument about whether somebody saw an instruction.</li><li><strong>What happens when a number changes?</strong> Ask how the history follows, and what becomes of messages already queued to the old one.</li></ul>
<h2 id="consent-and-rooms-you-were-not-invited-into">Consent, and rooms you were not invited into<a class="anchor" href="#consent-and-rooms-you-were-not-invited-into" aria-label="Link to this section">#</a></h2>
<p>Two lines are worth holding whatever the software permits.</p>
<p><strong>Ask before you add anybody.</strong> A number that reached your system through a contract, a visitor register or a group somebody was once in is not permission to send them things. Asking costs one message and settles it permanently. The rules here move from time to time, so verify the version in force where you operate — the practice stands on its own regardless.</p>
<p><strong>Read only what was addressed to you.</strong> If the software can see a group because a staff member's number is connected to it, it can also see conversations that have nothing to do with the company: a family group, a friend's chat, a discussion among workers. Keep only what a record genuinely requires, and be able to say plainly which is which. A person who suspects the system reads everything on their phone will carry a second phone, and then you have neither the record nor the trust.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Broadcasts, statements and system alerts belong to a company identity. Negotiations, chases and site instructions belong to a person the other side knows. Choosing one model for both is the mistake.</p>
<p>Ask where a reply goes, what survives somebody leaving, and what is stored and for how long. Then ask before adding anybody, and read only what was addressed to you.</p>]]></content:encoded></item>
<item><title>Getting paid on time, from the contractor's side</title><link>https://be-teck.com/blog/getting-paid-on-time/</link><guid isPermaLink="true">https://be-teck.com/blog/getting-paid-on-time/</guid><pubDate>Tue, 01 Sep 2026 19:45:00 +0530</pubDate><description>A correct bill can still sit unpaid for weeks. There are only four places it stops, and knowing which one you are in changes what you should ask.</description><category>contractors</category><category>money</category><category>accounts</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Your bill is correct and it has not been paid. In most cases that is not a judgement about you or about your work. It is a mechanical fact about a document that has stopped somewhere inside a building you cannot see into.</p>
<p>A payment moves when three documents agree and a person with authority signs. That is the whole machine. The order says what was agreed. Some record on their side says what arrived. Your bill says what is owed. When the three agree and the signature happens, paisa moves.</p>
<p>So every delay is one of four things, and none of them is fixed by asking when the payment will come.</p>
<h2 id="the-four-places-a-bill-stops">The four places a bill stops<a class="anchor" href="#the-four-places-a-bill-stops" aria-label="Link to this section">#</a></h2>
<ul><li><strong>Your bill does not match their record of what arrived.</strong> A quantity, a rate, a unit or an item code is different. The comparison they run is <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a>, and when it fails it usually fails quietly. Nobody rings the supplier to say that line four is short by two bags.</li><li><strong>Their record of what arrived does not exist.</strong> The material is on site and half of it is already in the slab, but no <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt note</a> was written when the lorry came in. There is nothing to compare your bill against, so there is nothing anybody is willing to approve.</li><li><strong>The bill reached the wrong person.</strong> It is with a site engineer who cannot approve it, in a drawer waiting for somebody to carry it to head office, or with an accounts clerk who is waiting for the site to confirm and has not told the site so.</li><li><strong>The person who must sign has not been asked.</strong> Everything agrees, the file is complete, and it is sitting in a queue behind other files because nobody has put it in front of the signatory.</li></ul>
<p>The first two you prevent. The second two you detect. The skill is telling them apart from the outside.</p>
<h2 id="a-fifth-place-nobodys-fault">A fifth place, nobody's fault<a class="anchor" href="#a-fifth-place-nobodys-fault" aria-label="Link to this section">#</a></h2>
<p>A fifth state belongs to none of the four, and we found it in our own software. A photographed challan becomes a receipt row matched against open purchases — and our matcher considered only purchases not yet paid. Money here often moves before dispatch, so by the time material arrived the correct purchase was already paid, and never a candidate. The challan matched nothing, and a challan matched to nothing appears on no screen.</p>
<p>Nothing failed loudly. If your bill sits in a state nobody on their side can name, ask about this class of fault: not a wrong rule, but a list of cases written before somebody thought of yours.</p>
<h2 id="preparing-a-bill-that-cannot-be-held">Preparing a bill that cannot be held<a class="anchor" href="#preparing-a-bill-that-cannot-be-held" aria-label="Link to this section">#</a></h2>
<p>Write the bill in their language, not yours. Everything on it should be findable in their system without a translation step, because the person checking it has a stack of other files open and will not translate.</p>
<p><strong>Quote their order number on every page.</strong> Not your quotation number, not your job number. If the order was amended, quote the amendment as well.</p>
<p><strong>Use their item codes and their descriptions.</strong> Your godown calls it one thing and their order calls it another. Bill it the way the order says it and put your own code in brackets after, if your accounts need it.</p>
<p><strong>Bill against what their site acknowledged, not against what you dispatched.</strong> This is the largest single cause of held bills. You sent a full load; the gate signed for less. Bill what was signed for and raise the shortfall separately as a written claim. A bill that exceeds the receipt does not get part-paid — it gets returned, and starts again at the back of the queue.</p>
<p><strong>Keep the unit the order used.</strong> A rate agreed per tonne and billed per quintal is a factor of ten, and on the page it looks like an ordinary line.</p>
<p><strong>Attach the acknowledged challans.</strong> Not your office copies — the ones with a name and a signature on them. A bill with its challans attached can be checked by one person at one desk. A bill without them starts a search across two offices, and searches get postponed.</p>
<p><strong>Show the arithmetic.</strong> Quantity times rate, then tax, then the line total, then the sum. Bills are typed by people and the arithmetic is wrong more often than anyone admits. Be wrong once and every future bill of yours is checked twice.</p>
<p>The same checklist from the buyer's desk is <a href="https://be-teck.com/blog/reconciling-a-vendor-bill/">reconciling a vendor bill</a>, and reading the other side's version is the fastest way to stop failing it.</p>
<h2 id="chasing-in-a-way-that-produces-information">Chasing in a way that produces information<a class="anchor" href="#chasing-in-a-way-that-produces-information" aria-label="Link to this section">#</a></h2>
<p>Most chasing produces nothing because the question has no useful answer. "When will it be paid?" can be answered honestly with "soon" by a person who has no idea, and both of you put the phone down having learned nothing.</p>
<p>Ask instead which of the four states the bill is in. Is it checked and matched? Is it waiting on a receipt from site? Is it with somebody for approval? Has it gone for payment? Four states, and the person on the phone can usually answer in one word.</p>
<p>Then ask for <strong>a name</strong>. Not a department. The bill is with a person, that person has a desk, and once you know the name you can ask a specific question next week instead of the same vague one. A file whose location is known moves faster than one whose location is not, because somebody now owns the answer.</p>
<p>And put every verbal agreement into a written line the same day. A message that says <em>as discussed today, the rate for the balance quantity is agreed at the revised figure and I will supply against it from tomorrow</em> costs nothing to send and becomes the only surviving record of a conversation that two people will remember differently in March. Send it while the call is fresh. The absence of a reply is also part of the record.</p>
<h2 id="fixing-your-own-side-first">Fixing your own side first<a class="anchor" href="#fixing-your-own-side-first" aria-label="Link to this section">#</a></h2>
<p>Three habits remove most of your own contribution to the delay.</p>
<p><strong>Get challans acknowledged by somebody authorised to acknowledge.</strong> A watchman's signature is proof that a vehicle arrived. It is not acceptance of the quantity, and at bill-checking time the difference matters. Find out who at that site is permitted to receive material and get their name on your copy.</p>
<p><strong>Confirm a rate change in writing before you supply against it.</strong> A revised rate agreed on a call and never written down will be paid at the old rate, and you will be arguing about it from a position of having already delivered. The order is the document that decides the rate. If the order was not amended, the rate did not change.</p>
<p><strong>Keep a ledger you can produce in one minute.</strong> Bill number, date, order number, amount claimed, amount received, balance. When your figure and theirs differ — and they will, over a year, for reasons on both sides — the party who can produce a dated statement immediately sets the terms of the discussion. That is the whole argument in <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a>.</p>
<p>Deductions are a separate matter from delay and worth not confusing with it. Money withheld on purpose is not a stuck file, and <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a> covers that case.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A bill is not a request. It is a document that has to survive a comparison made by a stranger who is not looking for a reason to help you.</p>
<p>Write it in their numbers, against what their site signed for, with the challans attached. Then chase by asking which of four states it is in and whose desk it is on, rather than when the money will come. The bill that cannot be questioned is the bill that gets signed.</p>]]></content:encoded></item>
<item><title>The challan that protects the supplier</title><link>https://be-teck.com/blog/a-challan-that-protects-the-supplier/</link><guid isPermaLink="true">https://be-teck.com/blog/a-challan-that-protects-the-supplier/</guid><pubDate>Tue, 01 Sep 2026 19:40:00 +0530</pubDate><description>A delivery challan is usually described from the receiving side. Written from the supplier's side it is evidence, and six months later it settles the argument.</description><category>contractors</category><category>stores</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Most descriptions of a delivery challan are written from the receiving side, where it is a document that arrives and must be checked. The mechanics of the document itself are in <a href="https://be-teck.com/blog/what-is-a-delivery-challan/">what a delivery challan is</a>.</p>
<p>From the supplier's side it is a different object. It is the only piece of paper you will ever hold that proves the material left your godown, reached their gate, and was taken in by somebody. Everything you are owed rests on it. Written carelessly it starts an argument. Written properly it ends one before it begins.</p>
<h2 id="what-earns-its-place-on-the-page">What earns its place on the page<a class="anchor" href="#what-earns-its-place-on-the-page" aria-label="Link to this section">#</a></h2>
<p>A challan is not a form to be filled. Every line on it is there because some line was once missing.</p>
<ul><li><strong>Their order number.</strong> The first thing anybody looks for and the first thing usually absent. Without it the challan belongs to no order and the accounts department cannot attach it to anything.</li><li><strong>Their site, described in their words.</strong> Not "Site 2" as your dispatch clerk calls it. The site name that appears on their order, because that is the name their file is under.</li><li><strong>The material, described the way their order describes it.</strong> Your trade name and their specification are different strings, and a storekeeper matching by eye at a gate will not reconcile them.</li><li><strong>Quantity in the unit the order used.</strong> Bags, tonnes, cubic metres, running metres, numbers. Change the unit and you have created a conversion that somebody must perform under a lorry in the sun.</li><li><strong>The vehicle number.</strong> It ties the paper to a physical event that a gate register and a security camera can both confirm.</li><li><strong>The date and the time of arrival.</strong> Time matters more than people think — a load booked in after cut-off, or on a day the site claims it was closed, is defended by a time.</li><li><strong>Space for a name, a signature and a designation.</strong> Three fields, not one. The middle one alone is nearly worthless.</li></ul>
<h2 id="the-details-nobody-tells-a-new-supplier">The details nobody tells a new supplier<a class="anchor" href="#the-details-nobody-tells-a-new-supplier" aria-label="Link to this section">#</a></h2>
<p><strong>Get a name, not a scribble.</strong> A signature that cannot be read is a signature nobody will own. Print the name below it, in your driver's hand if necessary, and the designation beside it. When the query comes, you are naming a person rather than waving an illegible mark.</p>
<p><strong>Know which fact you are collecting.</strong> A security guard's signature is a fact about arrival: this vehicle came in at this time. It is not acceptance of quantity or condition, and no amount of insisting will make it so at bill-checking time. If quantity matters — and it always matters — the signature you want is the storekeeper's or the site engineer's. Both signatures are worth having, for different reasons, and a <a href="https://be-teck.com/blog/a-gate-register-people-keep/">gate register people actually keep</a> is where the first one lives.</p>
<p><strong>Retain the signed copy, not the copy you wrote.</strong> This is the mistake that costs the most. A three-part challan is only useful if the part that comes back to you is the part with their signature on it. A file full of your own unsigned copies proves that you printed some paper.</p>
<p><strong>Photograph the signed copy at the gate.</strong> Before it goes back into the driver's pocket, before the lorry moves, while the vehicle number is still visible. Drivers lose paper. Paper gets wet. A photograph with a timestamp, sent to your own office on the spot, is a record that exists independently of whether the paper survives the return journey.</p>
<p><strong>Record a short delivery on the challan itself, at the gate.</strong> The site says four bags are damaged, or the count is under. Do not agree to fix it later. Write the accepted quantity on the challan, have it initialled, and supply the balance against a fresh challan. "We will adjust in the next load" is a sentence that has no document behind it, and in three months it will be your word against a ledger.</p>
<p><strong>Number it uniquely, in your own series.</strong> One unbroken series, no gaps, no restarts, no two challans with the same number in different books. A number that repeats destroys the ability of anyone — including you — to say which delivery is being discussed.</p>
<h2 id="three-situations-that-go-wrong">Three situations that go wrong<a class="anchor" href="#three-situations-that-go-wrong" aria-label="Link to this section">#</a></h2>
<p><strong>The site refuses to sign.</strong> It happens: the storekeeper is absent, the engineer says he is not authorised, the material is disputed. Do not let the lorry unload on a promise. If it must unload, write on the challan what was actually delivered, note the refusal and the name of the person who refused, photograph it, and send a message to your contact at their office the same day stating what was delivered and that a signature was declined. An unanswered written statement made on the day is much stronger evidence than a memory produced later.</p>
<p><strong>Unloaded, then questioned.</strong> The load is off the vehicle, the lorry has gone, and now the count is disputed. This is why the count happens before the vehicle leaves and why the driver waits. Once material is in a stack with other material, nobody can prove what you brought. If quantity is measured rather than counted — sand, aggregate, earth — then agree the method before you deliver, and understand what <a href="https://be-teck.com/blog/measured-and-docketed-quantity/">measured and docketed quantity</a> actually commits both sides to.</p>
<p><strong>The weighbridge slip disagrees with the invoice.</strong> Two weighbridges rarely agree exactly, and neither side is necessarily cheating. Decide in advance whose bridge is the reference, keep both slips with the challan, and treat a difference beyond the ordinary as a question to raise the same day rather than at bill time. A gap questioned on the day is a calibration discussion. The same gap questioned in month four is an accusation.</p>
<h2 id="filing-so-it-can-be-produced">Filing so it can be produced<a class="anchor" href="#filing-so-it-can-be-produced" aria-label="Link to this section">#</a></h2>
<p>A challan that cannot be found is the same as a challan that was never signed. File the signed copies by project and by month, keep the photographs in one place with the challan number in the file name, and attach them to your bill so the person checking never has to ask you for anything. That habit is the whole argument in <a href="https://be-teck.com/blog/keep-your-own-copy/">keeping your own copy</a>, and it is also what makes the difference between a bill that passes and a bill that waits, which is the subject of <a href="https://be-teck.com/blog/getting-paid-on-time/">getting paid on time</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The challan is your evidence, not their paperwork. It needs their order number, their site name, their unit, a vehicle number, a time, and a real name against the signature.</p>
<p>Keep the copy that came back signed, photograph it at the gate, write short deliveries on the spot rather than agreeing to adjust later, and never issue two challans with the same number. Everything you are owed is attached to that piece of paper.</p>]]></content:encoded></item>
<item><title>What a work order should say</title><link>https://be-teck.com/blog/what-a-work-order-should-say/</link><guid isPermaLink="true">https://be-teck.com/blog/what-a-work-order-should-say/</guid><pubDate>Tue, 01 Sep 2026 19:35:00 +0530</pubDate><description>Read it before you sign it. The clauses that decide whether a job is profitable are rarely the ones anyone reads, and three lines are usually missing.</description><category>contractors</category><category>procurement</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A work order is the document you will be held to for the next several months. It is usually read once, quickly, on the day it arrives, by somebody who is mostly checking the rate.</p>
<p>The rate is the least dangerous number in it. What decides whether the job makes money is a handful of clauses that read like boilerplate, and the difference between the two versions of a clause is often four words. The distinction between this document and a purchase order matters too, and <a href="https://be-teck.com/blog/work-order-or-purchase-order/">work order or purchase order</a> is worth being clear about before you read further.</p>
<h2 id="what-you-are-being-asked-to-do">What you are being asked to do<a class="anchor" href="#what-you-are-being-asked-to-do" aria-label="Link to this section">#</a></h2>
<p><strong>Scope.</strong> What the work is. Usually written well, because it is the part everybody discussed.</p>
<p><strong>Exclusions.</strong> What the work is not, which is more important and almost always thinner. Every item you assumed was somebody else's job needs to be named here. Cleaning up. Making good after another trade. Cutting and patching. Curing. Watchman. Storage. If it is not excluded, it is included, and the argument you lose is the one where both of you assumed the other had priced it.</p>
<p><strong>Material.</strong> Who supplies each item, who transports it, who stores it, who insures it while it sits at site, and — the one that quietly costs money — who bears the wastage. If the order is silent on wastage on employer-supplied material, you will be debited for a figure somebody else calculates.</p>
<p><strong>The rate, its unit, and what it includes.</strong> A rate means nothing until you know what it swallows. Taxes. Transport. Loading and unloading. Lifting to floor level. Scaffolding. Water. Power. Tools. Each of these has been the subject of a dispute on somebody's project this month. And the unit itself decides more than people expect — <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure</a> is the line to read twice, because a rate agreed in one unit and measured in another is not a small error. Whether the rate survives contact with the site is a separate question, covered in <a href="https://be-teck.com/blog/quoting-a-rate-you-can-live-with/">quoting a rate you can live with</a>.</p>
<h2 id="how-you-actually-get-paid">How you actually get paid<a class="anchor" href="#how-you-actually-get-paid" aria-label="Link to this section">#</a></h2>
<p><strong>Measurement method, and who measures.</strong> By what method is the quantity arrived at — from the drawing, or from the work as built? Deductions for openings, at what threshold? Who takes the measurement, who is present, and what happens when the two of you disagree. This clause decides the size of every bill you will ever raise on the job.</p>
<p><strong>Variations.</strong> How extra work is ordered, and how it is priced. Two separate questions. Pricing is either at the order's rates, at rates derived from them, or agreed case by case — and if it is the third, agreed before the work or after it. Then the sharp part: does a verbal instruction count? If the order says variations must be in writing, then a site engineer telling you to do something is not an order, however senior he is, and you will discover that at final account.</p>
<p><strong>Payment terms, and what triggers a bill.</strong> Not just the period. What event starts the clock — submission of the bill, certification of the bill, or receipt of some other document? A payment term that runs from certification with no time limit on certification is not a payment term.</p>
<p><strong>Retention.</strong> How much is held, on what, and — the part usually left vague — what event releases it and when. Its mechanics are in <a href="https://be-teck.com/blog/retention-money/">retention money</a>, and the clause to look for is the one naming the event, not the duration.</p>
<p><strong>Advance.</strong> How much, against what security, and how it is recovered: proportionally from each bill, from a stated point, or in a lump. The recovery schedule changes your cash position on every bill, not just the first. <a href="https://be-teck.com/blog/mobilisation-advance/">Mobilisation advance</a> covers what the money is really for.</p>
<h2 id="when-things-go-wrong">When things go wrong<a class="anchor" href="#when-things-go-wrong" aria-label="Link to this section">#</a></h2>
<p><strong>Time.</strong> The completion date, and what counts as grounds for an extension. Delay caused by the employer, by another contractor on the same floor, by drawings that arrived late, by material that was to be supplied and was not. If the extension clause lists no grounds, every delay is yours.</p>
<p><strong>Penalties.</strong> What is charged, on what base, and against what ceiling. A penalty with no ceiling is an unbounded liability on a fixed-value job.</p>
<p><strong>Safety and statutory responsibilities.</strong> In outline: who is responsible for site safety, for workers' welfare and insurance, for registrations attached to the work, and for deductions the employer must make from your payments. Do not accept a clause that assigns you an obligation you have not read the current text of. Obligations in this area change, and you should verify the version in force with your own advisor rather than trust the order's summary of it.</p>
<p><strong>Termination.</strong> On what grounds either side may end the contract, what notice is required, and — the clause people forget — how you are paid for work done and material brought to site at the point of termination.</p>
<h2 id="the-three-lines-usually-missing">The three lines usually missing<a class="anchor" href="#the-three-lines-usually-missing" aria-label="Link to this section">#</a></h2>
<p>Across most orders that later go wrong, the same three absences appear.</p>
<ol><li><strong>The measurement basis.</strong> Named nowhere, and so decided by whoever holds the tape at bill time.</li><li><strong>Variation pricing.</strong> The order says variations shall be instructed in writing and says nothing about how they will be valued.</li><li><strong>What "completion" means.</strong> Physical completion, handover, or the end of a defects period. Retention release, penalty stop and final bill all hang off this word, and the three of them can hang off different dates if nobody defines it.</li></ol>
<p>Ask for all three before signing. They are cheap to add on the day the order is drafted and impossible to add afterwards.</p>
<h2 id="orders-that-arrive-late-and-amendments">Orders that arrive late, and amendments<a class="anchor" href="#orders-that-arrive-late-and-amendments" aria-label="Link to this section">#</a></h2>
<p>Work often starts before the order arrives. That is normal in this trade and it is not, by itself, a disaster — but the order that eventually arrives will describe the job as somebody at head office understood it a month ago, not as it was actually instructed on site. Read it against what you have been doing, and raise the differences in writing before you sign, not at the first bill.</p>
<p>An amendment must be a document. A rate revised in a message, a scope extended in a meeting, a deadline moved on a call — none of these amends an order. Get an amendment sheet with a number, referencing the original order, signed by the same authority. And check that authority: an order signed by somebody without the power to sign it is a problem you will not discover until payment, when a person you have never met declines to approve a commitment their organisation did not make.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The rate is the number everybody reads and the clauses around it decide the profit. Exclusions, wastage, what the rate includes, how quantity is measured, how a variation is priced, what releases retention, and what "completion" means.</p>
<p>Read those before you sign. Insist that amendments are documents, and check that whoever signed the order was entitled to.</p>]]></content:encoded></item>
<item><title>Signing a document from a phone</title><link>https://be-teck.com/blog/signing-from-a-phone/</link><guid isPermaLink="true">https://be-teck.com/blog/signing-from-a-phone/</guid><pubDate>Tue, 01 Sep 2026 19:30:00 +0530</pubDate><description>Three different things are called a signature on a phone, and they prove very different amounts. What to check before your thumb touches the screen.</description><category>contractors</category><category>records</category><category>interface</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>You are standing at a site. A file arrives on your phone with a message saying please sign. You put your thumb on the screen, draw something that looks roughly like your name, and send it back.</p>
<p>What just happened, and is it worth anything six months from now?</p>
<p>The answer depends entirely on which of three quite different things the app did, and most people signing have never been told which one they are using.</p>
<h2 id="three-things-called-a-signature">Three things called a signature<a class="anchor" href="#three-things-called-a-signature" aria-label="Link to this section">#</a></h2>
<p><strong>A photograph of a wet signature, pasted onto a page.</strong> Somebody once signed a blank sheet, it was scanned, and now that image is dropped onto documents. This proves nothing about this document. The image can be lifted off one page and placed on another by anyone with the file, and it carries no information about when it was applied or by whom.</p>
<p><strong>A mark drawn on a touchscreen.</strong> You actually signed, at that moment, with your own hand. The mark is genuine as an act. Whether it is attached to anything depends on what the app recorded around it — who was logged in, when, from where, against which version of the file. Drawn on paper with a witness present, a signature draws its strength from context. On a phone the context has to be manufactured deliberately, and many apps do not bother. A drawn mark stored as a picture on a page is only slightly better than the pasted photograph.</p>
<p><strong>A cryptographic signature.</strong> The document is reduced to a fixed value computed from its exact contents, and that value is signed with a key held by one person. Change one character of the document afterwards and the value no longer matches, so the signature no longer verifies. This is the only one of the three that binds a specific person to a specific set of bytes and detects any later change to them. The general principle is in <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident documents</a>.</p>
<p>What each of these counts for in a dispute is a question of law, and law differs by jurisdiction and changes. Nothing here is legal advice. If you are about to rely on an electronic signature for something that matters, verify the position in force where you are with your own advisor, and ask specifically which of the three your system produces — the vendor will usually answer that question honestly if you ask it precisely.</p>
<h2 id="signing-something-at-site">Signing something at site<a class="anchor" href="#signing-something-at-site" aria-label="Link to this section">#</a></h2>
<p>You will not always have a choice about the tool. You do have a choice about how you use it.</p>
<p><strong>Read the whole document, not the page you were sent.</strong> A single page photographed and forwarded is not a document. It is an extract chosen by somebody else. Ask for the file.</p>
<p><strong>Check the page count.</strong> If it says one of nine and you have one page, you have not read eight pages of a thing you are about to be bound by. This is the most common way people sign a scope they never saw.</p>
<p><strong>Keep the version you signed.</strong> Not the sender's promise to send it afterwards — the actual file, downloaded to your own storage, on the day. If the only copy of the signed document lives in the other party's system, then the signed document is whatever their system says it is. That principle is the whole of <a href="https://be-teck.com/blog/keep-your-own-copy/">keeping your own copy</a>.</p>
<p><strong>Note the date and how it reached you.</strong> The message that carried it, from whom, at what time. Keep the message. The covering note often says something the document does not — <em>as discussed, rates unchanged</em> — and that note is part of the record.</p>
<p><strong>Do not sign a scope you have not read because the sender is waiting.</strong> Urgency is the standard technique for getting signatures onto documents that would not survive a slow reading. A work order deserves the attention described in <a href="https://be-teck.com/blog/what-a-work-order-should-say/">what a work order should say</a> whether it arrives on paper or as an attachment.</p>
<h2 id="if-you-are-the-one-asking-for-a-signature">If you are the one asking for a signature<a class="anchor" href="#if-you-are-the-one-asking-for-a-signature" aria-label="Link to this section">#</a></h2>
<p>The obligations run both ways, and a supplier who collects signatures from site staff carries most of them.</p>
<p><strong>Send the whole file.</strong> Every page, in one document, not a page at a time as questions arise.</p>
<p><strong>State plainly what is being signed.</strong> "Please sign" is not a statement. "This is the acknowledgement of quantity received today against your order, four pages" is. A person who signs without knowing what they signed will say so later, and they will be believed.</p>
<p><strong>Make the signed copy available immediately.</strong> Both sides should hold the same file, from the same minute. A signed document that only one party has is a document the other party can plausibly dispute.</p>
<p><strong>Never allow a signature to be applied to something that can afterwards change.</strong> This is the one that matters most and gets ignored most. If the document is a record in a database and the signature is a flag on that record, then editing the record after the signature leaves a signed document that nobody signed. The fix is not a policy telling people not to edit. The fix is that the signed thing is a frozen copy, and any change produces a new version requiring a new signature — with the old one still visible. Why the history has to survive is the argument in <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>.</p>
<p><strong>Do not let one login stand for two people.</strong> Where a document needs two approvals, the system must know that two distinct people signed it, at two times, from two accounts. A shared login collapses that into one act, and <a href="https://be-teck.com/blog/two-signatures-on-money/">two signatures on money</a> explains why the second signature exists in the first place.</p>
<h2 id="how-ours-works">How ours works<a class="anchor" href="#how-ours-works" aria-label="Link to this section">#</a></h2>
<p>Since we ask people to sign from phones, here is what we do.</p>
<p>A document on a task goes to the people on it and to named outside vendors, each with an unguessable link — a vendor's arrives on WhatsApp — signed with a finger on their own phone. A saved mark can only be applied by a session signed in as that person: not by an administrator, not by a helpful colleague. That refusal is what makes storing one safe.</p>
<p>Marks are drawn first and every page stamped afterwards, so the fingerprint each page carries belongs to the signed document, not the blank one. A round can be stopped mid-flight with a reason, killing every outstanding link; a completed one cannot. Asking again on a sealed document makes a fresh copy rather than overwriting what was vouched for.</p>
<h2 id="verifying-from-paper">Verifying, from paper<a class="anchor" href="#verifying-from-paper" aria-label="Link to this section">#</a></h2>
<p>Most of this still ends on paper. Somebody prints the signed document and files it, and the printed copy is what gets produced in a meeting.</p>
<p>A printed page carries no proof of anything by itself. What makes it checkable is a reference on the page that can be looked up independently — a document number and a short verification code, or a code that resolves to the stored version. Then the copy in a file can be held against the copy in the system, and if they differ, that fact becomes visible instead of being argued about.</p>
<p>Without something of that kind, a printed electronic signature is just an ink pattern on paper, and the person disputing it has only to say the file was different when they saw it.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Three quite different things are called signing on a phone: a pasted image, a drawn mark, and a cryptographic signature that binds a person to exact bytes. Only the third detects a later change, and what any of them counts for legally is something to verify where you are, with your own advisor.</p>
<p>Read the whole file, check the page count, keep your own copy of what you signed, and never let a signature sit on a document that can quietly change afterwards.</p>]]></content:encoded></item>
<item><title>Keep your own copy</title><link>https://be-teck.com/blog/keep-your-own-copy/</link><guid isPermaLink="true">https://be-teck.com/blog/keep-your-own-copy/</guid><pubDate>Tue, 01 Sep 2026 19:25:00 +0530</pubDate><description>At final account the argument is settled by whoever can produce a dated document the other side cannot contradict. Usually that is the larger party.</description><category>contractors</category><category>records</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The smallest discipline that most protects a small firm is also the least interesting one. Hold your own record of every event, in your own hands, in a form you can produce.</p>
<p>Not a better record than theirs. Your own. A separate one, made by your side, at the time.</p>
<h2 id="why-the-copy-decides-the-argument">Why the copy decides the argument<a class="anchor" href="#why-the-copy-decides-the-argument" aria-label="Link to this section">#</a></h2>
<p>At final account time nothing is settled by who is right. It is settled by who can produce a dated document the other side cannot contradict.</p>
<p>That sounds cynical and it is simply how the meeting goes. Two people remember a conversation from eleven months ago differently, both honestly. One of them opens a file and reads out a challan with a signature and a date on it. The discussion is over, and it was over because of the file, not because of the memory.</p>
<p>The asymmetry is the problem. The larger party has an accounts department, a filing convention, a system, and somebody whose job is to keep it. The smaller party has a phone with four thousand photographs on it and a storekeeper who left in March. Both sides forget equally; only one side can prove anything afterwards.</p>
<p>Every hour you spend on this is bought at the rate of the disputes it prevents, and it will feel wasted right up until the year it does not.</p>
<h2 id="what-to-keep">What to keep<a class="anchor" href="#what-to-keep" aria-label="Link to this section">#</a></h2>
<ul><li><strong>Signed challans.</strong> The copies that came back with a name on them, not the ones you wrote. This is the foundation of everything else, and <a href="https://be-teck.com/blog/a-challan-that-protects-the-supplier/">the challan that protects the supplier</a> is about getting them signed properly in the first place.</li><li><strong>The order, and every amendment to it.</strong> In one file, in order. An amendment sitting in a different folder from the order it amends will not be found by the person who needs it.</li><li><strong>Measurement sheets agreed at site, with a name against them.</strong> The quantity you and their engineer arrived at together, on the day, with his name on it. Not your calculation of it afterwards.</li><li><strong>Photographs of work before it is covered.</strong> Reinforcement before the pour, conduits before plaster, waterproofing before screed. Once it is covered, the only evidence it was done correctly is the photograph, and <a href="https://be-teck.com/blog/a-site-photograph-is-a-record/">a site photograph is a record</a> covers what makes one usable as evidence rather than decoration.</li><li><strong>Dated notes of verbal instructions.</strong> Sent as a message the same day, so there is a timestamp that is not yours to set.</li><li><strong>Your own bill register.</strong> Bill number, date, order, amount claimed, amount certified, amount received, balance. One row per bill, kept current.</li><li><strong>Payments actually received, against what you claimed.</strong> These diverge slowly and for many small reasons, and by the time anybody looks the gap has a history that nobody can reconstruct. That is the situation <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a> describes.</li></ul>
<h2 id="present-is-not-the-same-as-usable">Present is not the same as usable<a class="anchor" href="#present-is-not-the-same-as-usable" aria-label="Link to this section">#</a></h2>
<p>Most small firms already have the records. They cannot find them, which amounts to the same thing on the day it matters.</p>
<p><strong>One place.</strong> Not one place per person. If challans are on the driver's phone, measurements are in the engineer's notebook and bills are in the accountant's laptop, the firm has no records — three people have some.</p>
<p><strong>Named consistently.</strong> Project, then date, then what it is. Any convention works as long as it is the same one every time, because the thing you are buying is the ability to sort a folder and see a sequence. The value is not in the tidiness. It is in a gap being visible.</p>
<p><strong>Not only on the phone you drop.</strong> Phones are lost, stolen, replaced and dropped into freshly poured concrete. If the only copy of a year of challans is on a handset that goes into a drain, the year is gone. A copy somewhere else — a laptop, a drive, an account that syncs — costs nothing and is the difference between an inconvenience and a catastrophe.</p>
<p><strong>An hour a month, not a search in year three.</strong> Filing is cheap while the event is recent and the person who was there is still in the office. It is expensive after the storekeeper has left and nobody remembers which site the load went to. An hour at month end, filing what accumulated, is the whole system.</p>
<p><strong>Never overwrite.</strong> When a measurement is revised, keep the earlier one next to it. A file that only holds the latest version cannot show what was agreed and then changed, which is precisely the fact in dispute. That instinct is the subject of <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>, and the reason it matters is the same reason <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">an audit trail exists</a>.</p>
<h2 id="writing-back-is-the-cheapest-habit-in-the-trade">Writing back is the cheapest habit in the trade<a class="anchor" href="#writing-back-is-the-cheapest-habit-in-the-trade" aria-label="Link to this section">#</a></h2>
<p>Most instructions on a site are verbal. Somebody senior says do it this way, or add this, or stop that, and walks off to the next problem. Nothing is written, because writing it would be slow and slightly rude.</p>
<p>Send a message the same day. <em>As instructed by you this morning at the third floor, we are shifting the shuttering to the other bay and will resume the slab on Thursday.</em> Three lines, no argument in them, no demand.</p>
<p>What you have done is convert a memory into a record. It has a timestamp you did not set. It went to a person who could have corrected it and did not. In eight months, when the delay to the slab is being discussed, that message is the only surviving account of why, and its absence of a reply is part of it. Silence against a written statement made on the day is much harder to walk back than silence against a claim made later.</p>
<p>The same technique covers rate changes agreed on a call, scope added in a meeting, and material accepted with a condition attached. Write it back the same day, plainly, without heat.</p>
<h2 id="this-is-not-about-distrust">This is not about distrust<a class="anchor" href="#this-is-not-about-distrust" aria-label="Link to this section">#</a></h2>
<p>It reads as suspicion and it is not. Both sides forget. Their site engineer who agreed the extra work is transferred; your supervisor who did it leaves; the accounts clerk who understood the arrangement retires. Nobody is lying at the meeting. There is simply nobody left who was there.</p>
<p>Records are not a weapon against the other party. They are a defence against time, and time takes both sides equally.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Hold your own record of every event, made by your side, at the time. Signed challans, the order and its amendments, agreed measurements with a name, photographs before things are covered, verbal instructions written back the same day, and a bill register you can produce in a minute.</p>
<p>One place, named consistently, copied off the phone, filed for an hour each month. Not because anybody is dishonest, but because in three years you will be the only person in the room who can produce anything.</p>]]></content:encoded></item>
<item><title>What a site engineer should record, and what they should not</title><link>https://be-teck.com/blog/what-a-site-engineer-should-record/</link><guid isPermaLink="true">https://be-teck.com/blog/what-a-site-engineer-should-record/</guid><pubDate>Tue, 01 Sep 2026 19:20:00 +0530</pubDate><description>The site engineer witnesses most of what happens on a project. Here is what of that must survive in writing, and what should never enter the record.</description><category>contractors</category><category>site</category><category>field</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The site engineer is the only witness to most of what happens on a project. The head office, the client, the contractor's management, the auditor who arrives two years later — all of them see a report of it, never the thing itself.</p>
<p>That is not a compliment. It is a description of the job. What the engineer wrote down happened. What the engineer did not write down is available to be argued about, later, by people who were not there.</p>
<p>So what to record is not a clerical question. It decides what will still be true when everyone's memory has gone soft.</p>
<h2 id="what-must-be-recorded-because-it-will-be-asked-about">What must be recorded, because it will be asked about<a class="anchor" href="#what-must-be-recorded-because-it-will-be-asked-about" aria-label="Link to this section">#</a></h2>
<p>Start with the work itself.</p>
<ul><li><strong>What work was done, and where exactly.</strong> Not "slab work". Which element, which grid, which level, which block. A location that only makes sense to the person who wrote it is not a location.</li><li><strong>Quantities measured, and by whom.</strong> A quantity has an author. Two people measuring the same pour will differ, and knowing who held the tape is half of settling that difference later.</li><li><strong>Material received, and its condition.</strong> What arrived, how much, and what state it was in at unloading. Damage noticed after the lorry has left the gate is your damage.</li><li><strong>Labour present, by agency.</strong> Not a single headcount. So many from this contractor, so many from that one, in these trades.</li></ul>
<p>Then the entries that decide disputes.</p>
<ul><li><strong>Weather, or any event that stopped work.</strong> The hours lost and the reason. Delay claims are built out of these entries or they are not built at all.</li><li><strong>Instructions given and received, with who gave them.</strong> An instruction with no author is not an instruction. It is a rumour that cost money.</li><li><strong>Anything covered up before it could be inspected.</strong> Reinforcement concreted over, a service buried, a joint plastered. Record it before it disappears, because afterwards your note is the only evidence there is.</li><li><strong>Any deviation from drawing, with who approved it.</strong> Deviation is normal on every site. The unapproved deviation is the one that becomes expensive.</li></ul>
<h2 id="what-should-not-be-recorded">What should not be recorded<a class="anchor" href="#what-should-not-be-recorded" aria-label="Link to this section">#</a></h2>
<p>This half matters as much, and almost nobody is told it.</p>
<ul><li><strong>Opinions about people.</strong> That a supervisor is careless, that a gang is lazy, that a vendor cannot be trusted. These sentences are read out in rooms you will not be in, years after the person has changed. They damage the writer as much as the subject, and they prove nothing.</li><li><strong>A guess written as a measurement.</strong> If the pour was not measured, the entry is that it was not measured. An estimate recorded in the same column as a measurement contaminates every figure around it.</li><li><strong>A quantity copied off a docket and presented as measured.</strong> The whole point of an independent measurement is that it was taken independently, and the difference between the two is the subject of <a href="https://be-teck.com/blog/measured-and-docketed-quantity/">measured and docketed quantity</a>. A copied number destroys the only check anybody had.</li><li><strong>A photograph with no note of where and when.</strong> An unlabelled photograph of reinforcement is a photograph of reinforcement somewhere. It answers nothing and it can be answered back with another photograph.</li></ul>
<h2 id="an-observation-is-a-record-a-conclusion-is-not">An observation is a record, a conclusion is not<a class="anchor" href="#an-observation-is-a-record-a-conclusion-is-not" aria-label="Link to this section">#</a></h2>
<p>This is the distinction underneath everything above.</p>
<p><em>The joint was cast at 3 p.m. and the previous pour was completed the previous evening</em> is an observation. <em>The cold joint is the contractor's fault</em> is a conclusion. The first cannot be attacked. The second invites somebody to attack it, and once they do, the observation buried inside it gets attacked along with it.</p>
<p>The engineer's advantage is that they were there. That advantage is spent the moment they start writing findings instead of facts. A conclusion can be reached later by anyone holding good observations. An observation cannot be reconstructed later by anyone at all.</p>
<p>Where a conclusion genuinely has to be recorded — a decision was taken, work was stopped — write it as what it is, with its author, and keep it in a different sentence from the facts that led to it.</p>
<h2 id="record-it-at-the-moment-not-in-the-evening">Record it at the moment, not in the evening<a class="anchor" href="#record-it-at-the-moment-not-in-the-evening" aria-label="Link to this section">#</a></h2>
<p>The evening write-up is where accuracy dies. By six o'clock the sequence has collapsed, the two loads have merged into one, and the time an instruction was given has become "in the afternoon".</p>
<p>Record at the moment. Whatever the medium, the entry is worth more the sooner it is made, and a rough entry made at the time beats a tidy one made at eight. If the practical thing at that moment is to speak rather than write, speak — the argument for that is in <a href="https://be-teck.com/blog/the-voice-note-is-the-report/">the voice note is the report</a>. The tidy version can be assembled afterwards into <a href="https://be-teck.com/blog/the-daily-progress-report/">the daily progress report</a>, and it will be assembled out of something real.</p>
<p>A photograph with a note beats a note. The note gives the photograph its where and when; the photograph gives the note something that cannot be rewritten. Neither is worth much alone, which is the argument in <a href="https://be-teck.com/blog/a-site-photograph-is-a-record/">a site photograph is a record</a>.</p>
<h2 id="the-record-he-already-makes">The record he already makes<a class="anchor" href="#the-record-he-already-makes" aria-label="Link to this section">#</a></h2>
<p>There is a version of all this that engineers do without being asked, and most software never sees it. He sends a voice note — hands dusty, screen in the sun, one hand on a ladder. Speech is the only input available, and it usually carries more than the form would have collected.</p>
<p>We treated those as a labelled blob nobody opened for far too long. Transcribing them was the easy half. The half that mattered was deciding that the words afterwards take the same path a typed message takes, rather than a parallel one, because a parallel path is a second implementation of every rule and second implementations drift. That account is <a href="https://be-teck.com/blog/the-voice-note-is-the-report/">the voice note is the report</a>.</p>
<p>If an office wants an engineer to record more, the honest move is to accept the medium he already uses and do the structuring at the desk, where somebody has a keyboard and a moment.</p>
<h2 id="your-own-copy-is-not-the-offices-copy">Your own copy is not the office's copy<a class="anchor" href="#your-own-copy-is-not-the-offices-copy" aria-label="Link to this section">#</a></h2>
<p>The office copy exists to run the project. It is edited, summarised, merged into other documents, and eventually archived by somebody with different priorities.</p>
<p>The engineer's copy exists for one purpose: to say what this person saw, on this day, in their own hand. It should be complete, dated, and kept where a change of employer, a change of software or a change of mood at head office cannot reach it. Nobody is being accused of anything by that. Records get lost innocently far more often than they get lost deliberately, and the reasoning is set out in <a href="https://be-teck.com/blog/keep-your-own-copy/">keep your own copy</a>.</p>
<p>When the two copies disagree, the one written at the site on the day is the one that persuades people.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Record what happened, where, in what quantity, and on whose instruction. Record what was covered up and what departed from the drawing, with names against both.</p>
<p>Do not record opinions, guesses dressed as measurements, docketed figures dressed as measured ones, or photographs with no place and no date.</p>
<p>An observation is a record. A conclusion is not. Keep them apart, write at the moment, and keep your own copy.</p>]]></content:encoded></item>
<item><title>Month-end at a builder's accounts desk</title><link>https://be-teck.com/blog/month-end-at-a-builders-office/</link><guid isPermaLink="true">https://be-teck.com/blog/month-end-at-a-builders-office/</guid><pubDate>Tue, 01 Sep 2026 19:15:00 +0530</pubDate><description>The last four days of a month at a developer's accounts department, what must be true before the books close, and why it is always a scramble.</description><category>accounts</category><category>money</category><category>builders</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The last four days of a month at a builder's accounts desk look the same in every office. Somebody is on the phone to a site asking for a stock statement. Somebody is holding a bill they cannot book and cannot return. Somebody is passing an entry to make a total agree, and hoping nobody asks what it represents.</p>
<p>The scramble is not caused by month-end. Month-end only reveals it. What is actually being done in those four days is a month of matching that was not done as it happened.</p>
<h2 id="what-must-be-true-before-the-books-close">What must be true before the books close<a class="anchor" href="#what-must-be-true-before-the-books-close" aria-label="Link to this section">#</a></h2>
<p>Closing a period is a claim. The claim is that the figures now describe everything that occurred and nothing that did not. That claim rests on a short list.</p>
<ul><li><strong>Every bill received is either booked or on a stated hold.</strong> A hold is fine. A hold with no reason written against it is a bill that has been lost politely.</li><li><strong>Every goods receipt is matched or flagged.</strong> Material that arrived and has no bill against it is a liability whether or not anybody has typed it, and the method for getting there is in <a href="https://be-teck.com/blog/reconciling-a-vendor-bill/">reconciling a vendor bill</a>.</li><li><strong>Site stock has been counted and reconciled.</strong> Opening, plus received, less issued, equals closing — and the counted figure agrees with it, or the difference has a reason. The mechanics are in <a href="https://be-teck.com/blog/stock-reconciliation/">stock reconciliation</a>.</li><li><strong>The bank is reconciled.</strong> Every line on the statement is identified against something in the books, not merely totalled.</li><li><strong>Advances outstanding have been aged.</strong> How much is out, to whom, since when, and against what.</li><li><strong>Retention balances agree per contract.</strong> Not in total. Per contract, because that is the only level at which <a href="https://be-teck.com/blog/retention-money/">retention money</a> is ever released or argued about.</li><li><strong>Inter-entity balances agree in both directions.</strong> What one company shows as receivable, the other shows as payable, at the same figure.</li></ul>
<p>And underneath all of it: <strong>every accrual has a basis somebody can explain</strong>. An accrual whose only justification is that a similar number was accrued last month is not an estimate, it is an inheritance.</p>
<h2 id="the-failures-that-make-it-a-scramble">The failures that make it a scramble<a class="anchor" href="#the-failures-that-make-it-a-scramble" aria-label="Link to this section">#</a></h2>
<p>Each of these is ordinary. Each of them is also predictable, which is the point.</p>
<p><strong>The bill that arrives on the 2nd for work done in the previous month.</strong> The work happened, the period is being closed, and the document is in somebody's bag. This is the single most common cause of a month that has to be reopened.</p>
<p><strong>The site that submits its stock statement late, every month.</strong> Not occasionally. The same site, the same delay, and the accounts desk plans around it instead of fixing it.</p>
<p><strong>A payment made from the wrong entity's account.</strong> Convenient at the time, because that account had the balance. Now two sets of books are wrong, the inter-entity balances will not agree, and somebody must decide whether it was a loan, a reimbursement or an error. The general shape of that mess is covered in <a href="https://be-teck.com/blog/one-builder-many-companies/">one builder, many companies</a>.</p>
<p><strong>A receipt with a reference nobody can match to a buyer.</strong> Money has arrived. It belongs to someone. Until it is identified it sits in a suspense line that grows quietly all year, and the identification only gets harder — the method is <a href="https://be-teck.com/blog/matching-a-bank-line/">matching a bank line</a>.</p>
<p><strong>A bill held for a query that nobody chased.</strong> The query was legitimate on the day it was raised. Then it had no owner and no date, and now the vendor is calling about an invoice your books do not show at all.</p>
<p><strong>The adjusting entry made to force a total to agree.</strong> The most damaging one, because it works. The books close, the difference disappears, and the cause is still there, producing the same difference next month against a starting position that no longer means anything.</p>
<h2 id="why-the-pile-forms">Why the pile forms<a class="anchor" href="#why-the-pile-forms" aria-label="Link to this section">#</a></h2>
<p>A hold is a legitimate state. A pile is not.</p>
<p>The difference is that a state has an owner and a date. <em>Held pending rate confirmation from purchase, with the buyer who placed the order, since the day it was raised</em> is a state — it can be listed, chased and cleared. <em>Query</em> written on a sticky note on top of a stack of bills is a pile, and a pile is only ever worked when somebody panics about it.</p>
<p>The same distinction applies to unmatched receipts, unreconciled site stock and open advances. Every one of them is fine as a tracked exception and poisonous as an undifferentiated heap. The heap is what makes the last four days feel like an emergency, because the heap is where all the surprises were being stored.</p>
<h2 id="what-makes-the-scramble-smaller">What makes the scramble smaller<a class="anchor" href="#what-makes-the-scramble-smaller" aria-label="Link to this section">#</a></h2>
<p><strong>Match daily rather than monthly.</strong> The work is the same volume either way. Done daily, a mismatch is investigated while the storekeeper still remembers the lorry. Done monthly, the same mismatch is a research project. Nothing else on this list saves as much time.</p>
<p><strong>Give every hold an owner and a date.</strong> Then a hold is a queue with a length, and a queue with a length can be reported on, chased and reduced. A hold without those is indistinguishable from a loss.</p>
<p><strong>Close the previous period rather than leaving it open.</strong> An open period is a temptation. Entries drift backwards into it because backwards is easier than raising an adjustment, and after a few months nobody can say which figures are settled and which are still moving. A closed period forces the late bill to be handled as what it is — a known item, in a named month, with a reason — instead of being quietly absorbed.</p>
<p><strong>Fix the recurring late submitter instead of planning around them.</strong> A site that is late every month is not an accident. It is a process that has no deadline it believes in, and it will still be late in a year.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Month-end is not a task. It is an inspection of whether the month's matching was done, and it feels like a scramble precisely when it was not.</p>
<p>Before you close, know that every bill is booked or held with a reason, every receipt is matched or flagged, stock and bank are reconciled, advances are aged, retention agrees per contract, inter-entity balances agree both ways, and every accrual has a basis.</p>
<p>Then do the matching daily, make every hold a state with an owner and a date, and close the period behind you. The last four days get shorter every month you do it.</p>]]></content:encoded></item>
<item><title>Quoting a rate you can live with</title><link>https://be-teck.com/blog/quoting-a-rate-you-can-live-with/</link><guid isPermaLink="true">https://be-teck.com/blog/quoting-a-rate-you-can-live-with/</guid><pubDate>Tue, 01 Sep 2026 19:10:00 +0530</pubDate><description>What actually sits inside a construction rate, the two costs contractors forget, and the conditions that decide whether a quoted rate survives the job.</description><category>contractors</category><category>money</category><category>procurement</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A rate is not a price. A price is what you say. A rate is a promise to do a described piece of work, in described conditions, for a described sum, for as long as the job lasts.</p>
<p>Most contractors who lose money on a job did not quote the wrong number. They quoted a number that was right for a set of conditions nobody wrote down, and then the conditions changed.</p>
<p>This is the structure of a rate from the contractor's side, and the conditions that have to travel with it.</p>
<h2 id="what-is-actually-inside-a-rate">What is actually inside a rate<a class="anchor" href="#what-is-actually-inside-a-rate" aria-label="Link to this section">#</a></h2>
<p>Build it in layers. Each layer is a real cost that somebody pays, and if it is not in the rate, it is being paid out of the profit.</p>
<ul><li><strong>Material, with wastage.</strong> Not the quantity in the drawing. The quantity you will buy, which is larger, and by how much depends on the item, the handling and the site — the ways that gap opens are in <a href="https://be-teck.com/blog/wastage-on-site/">wastage on site</a>.</li><li><strong>Labour, with productivity.</strong> A gang's output per day in these conditions, not in ideal conditions. Height, access, congestion and the weather all move it.</li><li><strong>Plant, including its idle time.</strong> A machine on hire is paid for on the days it works and on the days a front was not ready.</li><li><strong>Transport and lifting.</strong> Getting material to the site is one cost. Getting it to the twelfth floor is a different one, and it is the one that gets left out.</li><li><strong>Scaffolding and shuttering, with repetitions.</strong> These are bought once and used many times. The number of repetitions you assume is the single most sensitive assumption in most rates, and it is usually optimistic.</li><li><strong>Consumables and supervision.</strong> Small individually, never small in total.</li><li><strong>Overheads and finance.</strong> Site establishment, head-office share, and the cost of money for the period between spending it and being paid.</li></ul>
<p>Then retention, which is your money held for a long period after the work is done, and profit, which is what is left if every line above was honest. The retention mechanics are worth knowing precisely before you price them: <a href="https://be-teck.com/blog/retention-money/">retention money</a>.</p>
<h2 id="the-two-everybody-forgets">The two everybody forgets<a class="anchor" href="#the-two-everybody-forgets" aria-label="Link to this section">#</a></h2>
<p><strong>The cost of money while the bill is outstanding.</strong> You buy material, pay labour weekly, submit a bill, wait for measurement, wait for certification, wait for payment, and then wait longer for the retained portion. That gap is funded by somebody, and if it is not funded by the rate it is funded by your overdraft or by your suppliers' patience. A rate that would be profitable at immediate payment can be loss-making at a long cycle, at exactly the same number. Price the cycle, not just the work.</p>
<p><strong>The cost of an item's own quality control and rectification.</strong> Testing, sampling, the inspection that fails, the patch that has to be cut out and redone. Every trade has a rectification rate that the people who do it know and never write down. It is not a contingency. It is a normal, recurring cost of producing acceptable work, and it belongs in the rate the way wastage does.</p>
<h2 id="the-conditions-attached-to-a-rate">The conditions attached to a rate<a class="anchor" href="#the-conditions-attached-to-a-rate" aria-label="Link to this section">#</a></h2>
<p>A rate without conditions is an open-ended promise. Five things should travel with every quoted rate, in writing, on the same page as the number.</p>
<ol><li><strong>What it excludes.</strong> Named, not implied. Scaffolding, lifting, dewatering, cutting and making good, final cleaning, testing — each is either in or out, and "not mentioned" always resolves in the other party's favour.</li><li><strong>What it assumes about access and continuity.</strong> A clear front, handed over in a stated sequence, with continuous work. A rate priced for a continuous run and executed in interrupted patches is a different rate.</li><li><strong>How long it stands.</strong> A validity period, after which it is re-quotable. Without one, a rate quoted at tender is still being applied to work executed years later.</li><li><strong>What happens if quantities move.</strong> A stated variation of quantity clause: beyond some agreed departure from the tendered quantity, the rate is open to review. Both directions, because a quantity that collapses hurts as much as one that multiplies.</li><li><strong>What happens if the specification changes.</strong> A different brand, a different grade, a different finish standard is a different rate, and saying so at quoting time is far cheaper than saying it later.</li></ol>
<h2 id="the-traps">The traps<a class="anchor" href="#the-traps" aria-label="Link to this section">#</a></h2>
<p><strong>A rate quoted in one unit and measured in another.</strong> Per running metre quoted, per square metre measured. Per tonne quoted, per quintal measured. This is the quietest and most expensive error available, because both documents look completely ordinary — see <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure</a>.</p>
<p><strong>A lump-sum item with open-ended scope.</strong> "Miscellaneous steel work" or "finishing as required" is not an item, it is an invitation. If the scope cannot be described, it cannot be priced, and the party who wrote the ambiguity is not the party who will pay for it.</p>
<p><strong>A low rate accepted because the quantity is small.</strong> Somebody shaves an item nobody expects to matter. Then the design develops, and the quantity of that one item multiplies. Loss per unit is unchanged; loss in total is now enormous. Read the schedule as a set of exposures, not a set of prices — the habit is described in <a href="https://be-teck.com/blog/reading-a-bill-of-quantities/">reading a bill of quantities</a>.</p>
<p><strong>Idle time when a front is not ready.</strong> Your gang is at the site, your plant is on hire, and the front has not been handed over. Somebody pays for that day. Unless the work order says who, it is you — which is one of several reasons why <a href="https://be-teck.com/blog/what-a-work-order-should-say/">what a work order should say</a> matters more than the rate printed on it.</p>
<p><strong>A rate accepted verbally and revised in a message.</strong> The original rate is in the order; the revision is in a WhatsApp thread. At final account, only one of the two is a document.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A rate is material with wastage, labour with productivity, plant with its idle time, transport, lifting, shuttering across its repetitions, consumables, supervision, overheads, finance and profit.</p>
<p>The two most commonly missing pieces are the cost of money while you wait to be paid, and the ordinary cost of putting your own defective work right.</p>
<p>Then attach the conditions: exclusions, assumptions about access and continuity, validity, what happens when quantities move, and what happens when the specification changes. The number is the easy half. The conditions are what make it a rate you can still live with in the final year of the job.</p>]]></content:encoded></item>
<item><title>When your ledger and theirs disagree</title><link>https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/</link><guid isPermaLink="true">https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/</guid><pubDate>Tue, 01 Sep 2026 19:05:00 +0530</pubDate><description>Balance confirmations never agree the first time. Reconcile events rather than totals, classify every difference by cause, and the argument becomes arithmetic.</description><category>contractors</category><category>accounts</category><category>money</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>You send a balance confirmation. It comes back with a different figure. Two organisations that have transacted with each other all year, from the same set of events, are holding two different numbers.</p>
<p>What happens next in most offices is a phone call in which two totals are read out at each other. That call never resolves anything, because a total is a sum of many events and no two people can subtract sums in their heads.</p>
<p>The rule is short. <strong>Never reconcile totals. Reconcile events.</strong></p>
<h2 id="the-method">The method<a class="anchor" href="#the-method" aria-label="Link to this section">#</a></h2>
<p>Four steps, in order. The order matters more than the effort.</p>
<ol><li><strong>Agree a cut-off date first.</strong> Before a single document is compared. Without it, half the differences you find are just the two sides looking at different windows, and you will spend an afternoon discovering that.</li><li><strong>List every document each side holds up to that date.</strong> Bills, payments, credit notes, debit notes, adjustments. Both lists, laid side by side, with dates and references. Not summaries. Documents.</li><li><strong>Tick what matches, and isolate what does not.</strong> Most lines match. The reconciliation is only ever about the residue.</li><li><strong>Classify each remaining difference by cause.</strong> One cause per item, from a short fixed list. This is the step that turns an argument into a worklist, because each cause has a different owner and a different fix.</li></ol>
<p>Do not debate the items while classifying them. Classify all of them first. An item argued in isolation takes twenty minutes; the same item, sitting in a group of six with the same cause, resolves in two.</p>
<h2 id="the-causes">The causes<a class="anchor" href="#the-causes" aria-label="Link to this section">#</a></h2>
<p>There are not many, and nearly every difference is one of them.</p>
<ul><li><strong>Timing.</strong> The document exists on both sides but falls in different months, or a payment is genuinely in transit. Nothing is wrong. It clears itself next period.</li><li><strong>A document one side never received.</strong> A bill posted and lost, an invoice emailed to somebody who left. One ledger has an event the other has never seen.</li><li><strong>A deduction one side made and did not communicate.</strong> The largest category, and the subject of the next section.</li><li><strong>A payment applied to a different bill.</strong> The money agrees; the allocation does not. Your ledger shows one invoice settled, theirs shows a different one settled and the first still open.</li><li><strong>A debit or credit note raised silently.</strong> Issued, posted internally, never sent. It moves your balance and nothing on their side moves with it.</li><li><strong>A rate or quantity difference on a single line.</strong> The bill was booked at the rate that was ordered, or at the rate that was invoiced, and those were not the same rate.</li><li><strong>Rounding, or a unit difference.</strong> Small and constant, or large and structural. Both look identical in a total.</li></ul>
<p>Anything that is none of the above is a genuine error, and there are always fewer of those than either side expects.</p>
<h2 id="deductions-are-the-biggest-single-cause">Deductions are the biggest single cause<a class="anchor" href="#deductions-are-the-biggest-single-cause" aria-label="Link to this section">#</a></h2>
<p>Because of what a deduction is. It is a decision made by one party, taken unilaterally, and communicated as a smaller number.</p>
<p>The payer knows exactly why the figure was reduced — short supply, damage, a rate correction, recovery of an advance, a set-off against another account, a quality disallowance. The payee receives a payment that is less than the bill and no explanation, and has to guess. So they post the receipt against the bill, leave a balance open, and chase it.</p>
<p>Both ledgers are now internally consistent and mutually contradictory, and they will stay that way for months. A year of this produces a confirmation that is out by an amount neither side can decompose. The conduct that prevents it is set out in <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a>, and where the reduction is money owed the other way, the mechanics and consequences are in <a href="https://be-teck.com/blog/set-off/">set-off</a>.</p>
<p>Two practices remove almost all of it.</p>
<p><strong>Every deduction carries a reason and a reference on the advice.</strong> Not in the accounting system, where only your side can read it. On the document the other party receives, against the specific bill it reduces.</p>
<p><strong>Every payment states which bills it settles.</strong> In full or in part, named by number. An unallocated payment is a difference waiting to be born, and it becomes the same problem on the receiving side that an unidentifiable credit in the bank statement is on yours — the identification work described in <a href="https://be-teck.com/blog/matching-a-bank-line/">matching a bank line</a>.</p>
<p>Do both, and the confirmation exercise stops being a negotiation. It becomes a tick-off.</p>
<h2 id="what-to-do-with-what-will-not-resolve">What to do with what will not resolve<a class="anchor" href="#what-to-do-with-what-will-not-resolve" aria-label="Link to this section">#</a></h2>
<p>Some items survive the classification. A deduction the other side disputes. A note one party insists was never received. A rate difference where each side holds a document supporting its own figure.</p>
<p>Do not net them into the balance. Netting a disputed item makes the total agree and destroys the record of the disagreement, and in six months nobody will be able to say what was conceded, by whom, or in exchange for what.</p>
<p>Record disputed items as disputed, on both sides, individually, with the amount, the reason and the date the dispute was raised. The agreed balance is then stated as the reconciled figure plus a listed set of open items. That is an honest confirmation, and it is a far stronger position than a clean number that quietly absorbed a concession.</p>
<p>Some of those items will eventually be conceded or abandoned. When that happens it is a decision with an author and a date, taken deliberately — the discipline in <a href="https://be-teck.com/blog/writing-off-money/">writing off money</a> — not a figure that softened while nobody was watching.</p>
<p>Reconciling often also shortens the collection cycle, because most delayed payments are not refusals. They are documents nobody could match, which is half the ground covered in <a href="https://be-teck.com/blog/getting-paid-on-time/">getting paid on time</a>.</p>
<h2 id="what-we-changed-on-our-own-side">What we changed on our own side<a class="anchor" href="#what-we-changed-on-our-own-side" aria-label="Link to this section">#</a></h2>
<p>Deductions were the cause we could design against, so we did.</p>
<p>Recording a stage payment below the agreed figure now asks <em>why less?</em> before it will accept the number. The shortfall and the reason sit on the stage row itself, not in a comment somebody may or may not read. And when the last stage of a schedule is settled, the order's total corrects itself to what the stages actually recorded. We swept the same rule backwards over schedules that had already closed.</p>
<p>It is a small prompt and it was not popular for a week. What it buys is that six months later, the gap between what was agreed and what was paid has a sentence attached to it, written by the person who decided, on the day they decided. That is the whole of what a reconciliation is trying to recover, and it is far cheaper to capture than to reconstruct.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Agree the cut-off, list the documents, tick what matches, and classify every residual difference by cause before arguing about any of them.</p>
<p>Most differences are timing, a missing document, an unexplained deduction, a misapplied payment, a silent note, or a single line's rate. Deductions dominate, because they are decisions communicated as a smaller number.</p>
<p>Put a reason and a reference on every deduction, name the bills on every payment, and record what cannot be resolved as an open dispute rather than folding it into the balance.</p>]]></content:encoded></item>
<item><title>The complaint names the wrong thing</title><link>https://be-teck.com/blog/the-complaint-names-the-wrong-thing/</link><guid isPermaLink="true">https://be-teck.com/blog/the-complaint-names-the-wrong-thing/</guid><pubDate>Tue, 01 Sep 2026 19:00:00 +0530</pubDate><description>One link was reported broken twice in a single day. Nothing was ever wrong with that link. Two unrelated faults were eating clicks and looked identical.</description><category>gaps</category><category>how-we-work</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The report was: the settings link does not work.</p>
<p>It was a completely accurate observation and a completely wrong diagnosis, and it was made twice in a single day, about two faults that had nothing to do with each other. Nothing was ever wrong with that link.</p>
<h2 id="the-first-one-a-sheet-nobody-could-see">The first one: a sheet nobody could see<a class="anchor" href="#the-first-one-a-sheet-nobody-could-see" aria-label="Link to this section">#</a></h2>
<p>A greeting panel mounted the moment it had something to show, while it was still marked as not yet visible. In that state it painted at zero opacity, covered the entire window, sat above everything else on the page, and still accepted every click.</p>
<p>It was meant to be switched to visible by an animation frame. Animation frames do not fire while a browser tab is in the background. This is an application people leave open in a background tab for hours at a stretch, so for those people the frame simply never came, and an invisible sheet stayed spread across the whole window taking every tap.</p>
<p>The page looked entirely normal. Nothing on it responded, anywhere, until it was reloaded. Settings looked like the culprit because the profile icon happens to be the first thing most people try.</p>
<p>Two fixes, and the order they went in matters more than either of them.</p>
<p>First, the general one: an overlay that cannot be seen may not take a click. That is now true everywhere in the application, regardless of what else goes wrong around it, and regardless of why some future overlay ends up invisible.</p>
<p>Only second, the specific one: the greeting no longer waits on a frame that is never coming.</p>
<p>Doing the specific fix alone would have made the symptom disappear and left the shape exactly where it was. The next transparent overlay would be written in a different file, later, by somebody who had never heard this story, and it would produce exactly the same confusion.</p>
<h2 id="the-second-one-two-handlers-and-the-blind-one-won">The second one: two handlers, and the blind one won<a class="anchor" href="#the-second-one-two-handlers-and-the-blind-one-won" aria-label="Link to this section">#</a></h2>
<p>Later the same day, the same words from the same person. This time it really was the menus.</p>
<p>Menus in this application are rendered into the end of the document rather than in place, so that the header cannot clip them. The component that owns them closes on an outside click, correctly, by checking whether the click landed inside the panel it actually painted.</p>
<p>But four of those menus had also kept an older handler from before they were moved, one that checked whether the click landed inside the component's own wrapper. Once the menu was being rendered elsewhere, its items were no longer inside that wrapper. So a click on a menu item looked to the old handler like a click on the outside world, and it closed the menu on the press, a beat before the click could reach the link underneath.</p>
<p>Two handlers watching for the same event. One of them blind to where the menu now lived. The blind one won the race.</p>
<p>The fix was deletion. The four components stopped keeping their own handler, and the one place that logic belongs does it for all of them.</p>
<h2 id="why-this-is-worth-writing-down">Why this is worth writing down<a class="anchor" href="#why-this-is-worth-writing-down" aria-label="Link to this section">#</a></h2>
<p>A symptom is a location, not a cause. It tells you where somebody was standing when the work stopped, which is genuinely useful, and it tells you almost nothing about why.</p>
<p>More usefully: the same symptom can have several different causes queued up behind each other. Fix the first, ask "is it working now?", and the honest answer from the person now standing in front of the second one is no. This reads, to everybody involved, as the fix having failed. It is a bad moment. It is also the ordinary state of affairs in any system old enough to have been changed by more than one person, and expecting it makes it much less alarming.</p>
<p>The useful discipline is to separate what was observed from what was concluded, even when the person reporting it is certain, and especially when they are right about the observation. Two things were true at once here: the link was not working, and nothing was wrong with the link.</p>
<h2 id="the-check-that-was-wrong-about-itself">The check that was wrong about itself<a class="anchor" href="#the-check-that-was-wrong-about-itself" aria-label="Link to this section">#</a></h2>
<p>One more piece, because it is the part we would most like to have skipped.</p>
<p>The automated check written to stop the invisible overlay coming back was wrong on its first attempt. The long comment explaining the fix had been placed between the two things the check needed to compare, which pushed one of them outside the window it was looking at. So the check passed. It passed with the bug sitting directly in front of it, and it would have gone on passing for as long as anyone cared to trust it.</p>
<p>That was only found because the bug was deliberately put back, to watch the check go red. It did not. The check now strips comments before it looks, and it was re-tested the same way.</p>
<p>A test you have never seen fail is a test you are trusting on its own word. It takes about a minute to break the thing on purpose and confirm that something notices. Almost nobody does it, which is why so many green suites are green for reasons unrelated to the code being correct.</p>
<h2 id="the-shape">The shape<a class="anchor" href="#the-shape" aria-label="Link to this section">#</a></h2>
<p>The people reporting problems are describing where they were standing. That is their job, and it is a real contribution. Turning that into a cause is ours, and the work is mostly resisting the first plausible explanation for long enough to check whether the thing named in the complaint was ever involved at all.</p>
<p>The check that passed with the bug in front of it has a longer treatment in <a href="https://be-teck.com/blog/a-test-that-defends-a-bug/">a test that describes the code will defend a bug</a>, and the habit of explaining a refusal rather than simply making one is in <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>]]></content:encoded></item>
<item><title>Paying a labour contractor</title><link>https://be-teck.com/blog/paying-a-labour-contractor/</link><guid isPermaLink="true">https://be-teck.com/blog/paying-a-labour-contractor/</guid><pubDate>Tue, 01 Sep 2026 19:00:00 +0530</pubDate><description>Attendance, measured work, advances and recoveries. How labour contract payments actually run on an Indian site, and where both sides end up cheated.</description><category>contractors</category><category>money</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Most Indian sites run on a labour contract. A contractor brings a gang, the site provides material, and the contractor is paid either for the days worked or for the work measured. Everything else — the arguments, the settlements, the man who walks off a job — comes out of how that payment is recorded.</p>
<p>This is about the structure of the arrangement, not the law around it. Statutory obligations attaching to contract labour are real, they differ by where and how you operate, and they change. Verify the version in force with your own advisor before you act on any of it. What follows is only about keeping the <em>hisaab</em> straight between two parties.</p>
<h2 id="two-bases-and-most-arrangements-are-quietly-both">Two bases, and most arrangements are quietly both<a class="anchor" href="#two-bases-and-most-arrangements-are-quietly-both" aria-label="Link to this section">#</a></h2>
<p><strong>Attendance.</strong> So many workers, so many days, at a day rate per category. Simple to administer, and it pays for presence rather than output.</p>
<p><strong>Measured work.</strong> A rate per unit of work completed, measured jointly. It pays for output, and it needs a measurement everyone accepts.</p>
<p>Almost every real arrangement is both, and almost nobody says so. The headline is a piece rate, but the gang was also on site for three days when no front was available and something has to be paid for that. Or the headline is a day rate, but everyone knows that a certain output is expected and a shortfall will be argued about at the end of the month.</p>
<p>Write down which basis governs, and — this is the part that is always missing — write down what happens in the cases the basis does not cover. Idle days when a front is not ready. Work done and then damaged by another trade. A partial month. If those are undecided at the start, they are decided at settlement, by whoever is holding the money.</p>
<h2 id="the-muster-and-what-makes-one-credible">The muster, and what makes one credible<a class="anchor" href="#the-muster-and-what-makes-one-credible" aria-label="Link to this section">#</a></h2>
<p>The root of most labour disputes is an attendance record kept by the contractor's own supervisor and never independently seen. It is written by the party being paid, for the party paying, and nobody else ever looks at it. Whatever it says is what gets paid, and both sides know it can be wrong in either direction.</p>
<p>A credible muster has four properties.</p>
<ul><li><strong>Recorded at the site.</strong> Not compiled at a room somewhere from a phone call. At the gate, or at the workface.</li><li><strong>Recorded at the time.</strong> Morning, when people arrive, not reconstructed in the evening from memory and a headcount.</li><li><strong>Recorded by a person who was there.</strong> Someone who could see the people they were marking present.</li><li><strong>Able to tell one worker from another.</strong> A count is not attendance. A count can be inflated by one and nobody can prove anything. Identity is what makes a muster evidence.</li></ul>
<p>The site's copy and the contractor's copy should be made from the same act, not from two separate acts that are later compared. Where the site has no network at the gate, the capture still has to happen at the gate and reach the office afterwards, which is the whole argument in <a href="https://be-teck.com/blog/attendance-without-signal/">attendance without signal</a>.</p>
<h2 id="the-payment-mechanics">The payment mechanics<a class="anchor" href="#the-payment-mechanics" aria-label="Link to this section">#</a></h2>
<p>Four things move money between the headline figure and what is actually handed over, and each has its own history.</p>
<ul><li><strong>Advance taken mid-month.</strong> Almost universal, because gangs are paid weekly and bills are settled monthly. It is a loan, it must be recovered, and it needs a running balance — the same discipline as a <a href="https://be-teck.com/blog/mobilisation-advance/">mobilisation advance</a> at a larger scale.</li><li><strong>Deduction for material issued.</strong> Cement, binding wire, consumables, sometimes tools. The contractor's account is debited at an agreed rate. This only works if the issues were recorded when they left the store, as in <a href="https://be-teck.com/blog/running-a-site-store/">running a site store</a>.</li><li><strong>Deduction for rectification.</strong> Work redone by others at the contractor's cost. Legitimate, and the one most often applied without telling anybody what it was for.</li><li><strong>Retention or a held amount.</strong> Some portion kept back until the work is complete or a defect period passes.</li></ul>
<p>And the thing nobody keeps: <strong>a running balance</strong>. Bills raised, payments made, advances given, advances recovered, deductions applied, balance carried forward. Kept monthly, it is a page. Kept nowhere, it becomes the final settlement argument.</p>
<h2 id="where-it-goes-wrong">Where it goes wrong<a class="anchor" href="#where-it-goes-wrong" aria-label="Link to this section">#</a></h2>
<p><strong>A name on the muster nobody can identify.</strong> Present for months, paid for months, and no one at the site can point to the person. Either the record is inflated or a real worker is unidentified, and neither is discoverable afterwards.</p>
<p><strong>A worker paid by both the contractor and the site.</strong> Somebody was pulled onto a departmental job for a week, marked present on both records, and paid twice. Common where labour moves between gangs.</p>
<p><strong>An advance given in cash with no acknowledgment.</strong> The commonest single cause of a settlement that cannot be closed. The site is certain it was given; the contractor is certain it was less, or was against something else. There is nothing to consult.</p>
<p><strong>A measurement agreed verbally at site.</strong> Two people looked at the work, agreed a figure, and neither wrote it down with both names against it. Six weeks later they remember different figures, honestly.</p>
<p><strong>The final settlement where neither side's arithmetic agrees.</strong> The predictable consequence of the four above. Months of small undocumented adjustments accumulate, and at the end of a job the two totals differ by an amount neither party can decompose. It is the same disease, at a smaller scale, as <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a>, and it is settled the same way — by events, not totals.</p>
<h2 id="what-helps">What helps<a class="anchor" href="#what-helps" aria-label="Link to this section">#</a></h2>
<p><strong>Capture attendance where the person is.</strong> At the gate or the workface, at the time, with something that distinguishes one worker from another. Every other improvement depends on this one.</p>
<p><strong>Keep an issued-material register the contractor signs.</strong> Signed at issue, not agreed at settlement. An unsigned issue record is your word against theirs, and at settlement it is worth nothing.</p>
<p><strong>Hand over a running statement every month.</strong> Bills, payments, advances, recoveries, deductions with reasons, and the balance. Given monthly, a disagreement surfaces while both parties still remember the week in question. Deferred to the end of the job, the same disagreement is unresolvable and usually ends with somebody being cheated.</p>
<p><strong>Give the contractor a copy of everything they signed.</strong> A party who holds no records has no way to check yours, and a contractor who cannot check becomes a contractor who assumes the worst — which is the general case for <a href="https://be-teck.com/blog/keep-your-own-copy/">keeping your own copy</a> on both sides of any arrangement.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Decide whether you are paying for attendance or for measured work, and write down what happens in the cases that basis does not cover.</p>
<p>Make the muster credible: at the site, at the time, by someone who was there, with workers distinguishable from one another. Record advances and material issues at the moment they happen, with a signature.</p>
<p>Then hand over a running statement every month. Almost every labour settlement that ends badly ended badly because the arithmetic was attempted once, at the end, from memory.</p>]]></content:encoded></item>
<item><title>Capitals are a contrast, not a volume</title><link>https://be-teck.com/blog/capitals-are-a-contrast/</link><guid isPermaLink="true">https://be-teck.com/blog/capitals-are-a-contrast/</guid><pubDate>Tue, 01 Sep 2026 18:00:00 +0530</pubDate><description>One line of styling put a whole application into capital letters. It read as deliberate for about a week, and after that it just read as shouting.</description><category>interface</category><category>design</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Somebody asked for the interface in capitals. It is a reasonable thing to want. Capitals look decided; a screen of them looks like it means business.</p>
<p>It shipped as one line of styling on the page body, and that line inherits into everything inside it. So the application capitalised its labels, which was the idea, and it also capitalised task titles, descriptions, comments people had typed themselves, names, error messages and empty states, which was not.</p>
<p>For about a week it looked deliberate. Then it just looked loud.</p>
<h2 id="what-it-cost">What it cost<a class="anchor" href="#what-it-cost" aria-label="Link to this section">#</a></h2>
<p>Capitals work as emphasis only while most of the screen is not capitalised. Emphasis is a difference, not a property. Spend it on everything and there is none left over for the four labels that genuinely needed it, and the screen arrives at a strange place: every element is shouting and nothing stands out.</p>
<p>The second cost is not a matter of taste. We read words by their shape. The tall letters and the ones that hang below the line give every word an outline your eye recognises before you have finished looking at it. Capitals are all the same height with flat sides, so the outlines collapse into rectangles and a capitalised sentence is read closer to letter by letter. That is measurably slower, and it is worst in bad conditions: on a phone, outdoors, in sunlight, which is where a great deal of this particular application is used.</p>
<h2 id="how-it-was-noticed-which-is-the-interesting-part">How it was noticed, which is the interesting part<a class="anchor" href="#how-it-was-noticed-which-is-the-interesting-part" aria-label="Link to this section">#</a></h2>
<p>Not by a complaint. Nobody in the building said "the type is tiring". People almost never say that, because nobody experiences reading as a task they could have an opinion about.</p>
<p>It was noticed by comparison. Two screens were put side by side, built in the same palette, and one of them looked expensive and the other did not. The difference was assumed to be the typeface. It was not the typeface. It was case.</p>
<p>That is the usual route for this class of problem. It does not arrive as a report. It arrives as a vague preference for one thing over another, and the work is turning the preference into a sentence somebody can act on.</p>
<h2 id="writing-the-rule-down-as-data">Writing the rule down as data<a class="anchor" href="#writing-the-rule-down-as-data" aria-label="Link to this section">#</a></h2>
<p>The repair could have been a comment in the code saying what capitals are for. A comment agrees with itself for ever and stops nothing.</p>
<p>Instead there are now two lists: what capitals are for, and what may never be capitalised. The second list is the one that matters — a person's name, a proper noun, anything a human being typed. Written as data rather than prose, a checker can execute it and refuse a change that breaks it. Written as a paragraph, it would have survived exactly as long as the memory of the argument that produced it.</p>
<p>Then the blanket rules were separated by what they actually govern:</p>
<ul><li>A chip and a field label keep their capitals. Both are short names for a slot, not sentences.</li><li>A button lost them. A button's text is a verb somebody reads and then acts on.</li><li>Navigation labels lost them, which is why the menu had been shouting the name of every page even though those names were written in ordinary case in the code.</li><li>A section heading lost them, because a heading is a phrase.</li></ul>
<h2 id="the-catch-that-nearly-shipped-a-regression">The catch that nearly shipped a regression<a class="anchor" href="#the-catch-that-nearly-shipped-a-regression" aria-label="Link to this section">#</a></h2>
<p>Of the application's table header cells, 129 out of 138 carried no case rule of their own. For as long as the blanket rule existed they never needed one. So deleting the blanket would have quietly un-capitalised every column heading in the application, which the newly written rule says should be capitalised: a column heading is a short name for a slot, the clearest case there is.</p>
<p>This is worth generalising. A blanket rule does not only apply a thing. It hides which places were depending on it. Every site that stopped declaring its own intention because the blanket was covering it becomes invisible, and stays invisible right up until the blanket comes off. Removing one is a survey, not a deletion, and the survey is the whole job.</p>
<h2 id="where-we-deliberately-did-nothing">Where we deliberately did nothing<a class="anchor" href="#where-we-deliberately-did-nothing" aria-label="Link to this section">#</a></h2>
<p>The screens at the gate were left exactly as they were. Their signage is pictograms, very large tabular numerals and Devanagari, none of which capitalisation touches at all. They were built to be usable by somebody who reads neither English nor the interface language, so they never leaned on capitals in the first place and had nothing to lose.</p>
<p>It is worth checking for that before a sweep. The screens that need protecting from a change are rarely the ones you expect, and some of them turn out to have been immune the whole time, for reasons that were good ones when they were built.</p>
<h2 id="the-shape">The shape<a class="anchor" href="#the-shape" aria-label="Link to this section">#</a></h2>
<p>The instruction was right. The implementation was one line too broad, and the whole cost sat in the scope rather than the intent.</p>
<p>The wider lesson about blanket rules — that removing one is a survey rather than a deletion — is in <a href="https://be-teck.com/blog/defaults-are-decisions/">a default is a decision somebody made once</a>. And the gate screens that were immune to all of this are the subject of <a href="https://be-teck.com/blog/a-gate-register-people-keep/">a gate register somebody will actually keep</a>.</p>
<p>That is a very common way for a small change to become a problem nobody can name. Everyone agrees with what was asked for. Everyone can see the result is somehow worse. Because the request was granted, there is nothing obvious to complain about, so nobody does, and the screen stays tiring for a year.</p>]]></content:encoded></item>
<item><title>Written, and never wired</title><link>https://be-teck.com/blog/written-and-never-wired/</link><guid isPermaLink="true">https://be-teck.com/blog/written-and-never-wired/</guid><pubDate>Tue, 01 Sep 2026 17:00:00 +0530</pubDate><description>The code to undo a wrong stock entry already existed and had no callers. Nobody had asked for the button, because a workaround was already doing the job.</description><category>gaps</category><category>how-we-work</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A storekeeper types the wrong quantity into a goods receipt. It happens the way every typing mistake happens: at the end of a long afternoon, on a phone, with a lorry waiting.</p>
<p>There was no way to undo it. The number stayed wrong, and the correction happened on paper, in a note, and in the head of the one person who remembered which entry was the bad one.</p>
<p>The strange part is that the code to undo it already existed. It had been written. It had no callers at all. No button, no menu item, no route: a complete, plausible, entirely unreachable function.</p>
<h2 id="this-is-one-of-the-commonest-things-we-find">This is one of the commonest things we find<a class="anchor" href="#this-is-one-of-the-commonest-things-we-find" aria-label="Link to this section">#</a></h2>
<p>It is not a curiosity. On the same system, two buttons — send this document for signature, and open it in the document editor — had never once appeared for anybody, on any screen, in the whole life of the feature. Both were gated on a flag meaning "this file can be edited as text", which is false for every PDF there has ever been. The feature worked. Nobody could reach it.</p>
<p>Elsewhere, text had been machine-read out of well over a thousand photographs sent from site, and stored, and nothing had ever looked at it. The check that should have used it read only the caption somebody typed, and site photographs usually have no caption, because the delivery slip in the picture already says everything.</p>
<p>Built is not the same as reachable. Reachable is the only one a person experiences.</p>
<h2 id="wiring-it-up-was-not-safe">Wiring it up was not safe<a class="anchor" href="#wiring-it-up-was-not-safe" aria-label="Link to this section">#</a></h2>
<p>This was the lesson we did not expect, and it is the more useful one.</p>
<p>Code that has never run has never been wrong out loud. It has been reviewed, probably, and it reads correctly, and it has never once met a real store, a real lorry or a real person in a hurry. Six faults had to be fixed before that undo could be given a button. Some of them, in shape:</p>
<ul><li>It marked the original entry as cancelled, and one of the readers that counts stock never checked that mark. A cancelled receipt would have gone on counting for ever, and the balance would have been wrong in a new way.</li><li>It never asked whether the stock had since gone out again. Cancelling a receipt after most of it had been issued would have driven the balance below zero, silently, which is not a state a store can be in.</li><li>Its permission check asked only whether you were an administrator, so anybody whose name was on a row could cancel that row.</li><li>It could reach through the store's door and cancel an entry that the gate had written, leaving the gate's own register saying the lorry arrived and the entry impossible to put back.</li><li>The reason for the cancellation never reached the audit trail, because the trail reads the reason from the record's new state and no reason was ever handed to it. Every cancellation would have been recorded as having happened for no stated reason.</li></ul>
<p>None of those is a careless mistake. Each is the kind of thing you discover the first time the code meets the world, and this code never had.</p>
<h2 id="what-it-does-now">What it does now<a class="anchor" href="#what-it-does-now" aria-label="Link to this section">#</a></h2>
<p>A cancellation writes two halves in one movement: the original marked cancelled, and a reversing correction of the opposite sign which is born already cancelled itself.</p>
<p>That shape is deliberate. A reader that filters out cancelled rows sees neither half. A reader that forgets to filter sees both, and both add to zero. The answer is correct under either reading, which is what you want when you cannot personally audit every piece of code that will ever count your stock. It is also keyed so that a second reversal of the same entry is impossible.</p>
<p>Before it acts it states the effect in numbers: the store reads this much of this material, cancelling this entry leaves that much. And it requires a reason, which now actually arrives in the record.</p>
<h2 id="why-nobody-asked-for-the-button">Why nobody asked for the button<a class="anchor" href="#why-nobody-asked-for-the-button" aria-label="Link to this section">#</a></h2>
<p>Because there was a workaround, and the workaround worked.</p>
<p>Somebody knew how to make the number look right again. It took a few minutes, it involved a second entry and a note, and it was taught to the next person who needed it. Within a few months it was simply how a wrong receipt gets fixed here. The gap had not closed. It had been staffed.</p>
<p>Nobody files a request for something they have already learned to live without. That is not a failure of the people; it is what competent people do with an obstacle. They route around it, and the routing becomes invisible, including to them.</p>
<h2 id="two-questions-worth-asking-of-your-own-tools">Two questions worth asking of your own tools<a class="anchor" href="#two-questions-worth-asking-of-your-own-tools" aria-label="Link to this section">#</a></h2>
<p>The first: what has been built here that nothing calls? Not as an audit exercise — as a search for things somebody once thought were needed, and were, and never arrived. Half-finished work does not announce itself, because from the outside it looks exactly like work that was never started.</p>
<p>The second, and it is better: what does everybody in this room already know how to work around? Ask it out loud, in a meeting, and wait through the pause. The answers do not come as complaints. They come as instructions, delivered helpfully, in the tone of someone explaining how a door has to be lifted before it will close.</p>
<p>It is also the most productive question to ask when somebody is leaving a role, for the reasons in <a href="https://be-teck.com/blog/what-makes-a-handover-fail/">what makes a handover fail</a>. And the reversal described above is a worked example of a rule we hold everywhere: <a href="https://be-teck.com/blog/append-only-records/">correct by adding, never by overwriting</a>.</p>]]></content:encoded></item>
<item><title>Filed as chatter</title><link>https://be-teck.com/blog/filed-as-chatter/</link><guid isPermaLink="true">https://be-teck.com/blog/filed-as-chatter/</guid><pubDate>Tue, 01 Sep 2026 16:00:00 +0530</pubDate><description>A document was waiting on one person's signature, and the request reached them as a line in a digest. Not a training gap. A row in a routing table.</description><category>gaps</category><category>notifications</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A document was sent for signature. It sat there. The person who had to sign it did not know they had to sign it.</p>
<p>They were not ignoring it, and they had not missed a message. The message had arrived exactly as the system intended, and the way the system intended was wrong.</p>
<h2 id="what-the-machine-actually-did">What the machine actually did<a class="anchor" href="#what-the-machine-actually-did" aria-label="Link to this section">#</a></h2>
<p>The signature request went out carrying a generic type: <em>question</em>. Types are mapped onto rows in a grid, and <em>question</em> had been mapped, sensibly enough, onto the row for comments. The comment row's default delivery is a bulletin: held back until the next scheduled broadcast, three a day, ringing nothing, arriving as one line among a dozen others that also did not need doing right now.</p>
<p>So a document that was holding up a payment was delivered as chatter.</p>
<p>Every component in that chain did its job. The request was raised correctly. It was classified into a real category. That category was routed by a rule somebody had written down on purpose. Nothing failed. The design had simply never been asked what a signature request <em>is</em>, so it answered a different question and answered it well.</p>
<h2 id="the-distinction-we-ended-up-writing-down">The distinction we ended up writing down<a class="anchor" href="#the-distinction-we-ended-up-writing-down" aria-label="Link to this section">#</a></h2>
<p>The instinct, when this surfaces, is to reach for importance: mark it urgent, give it a red badge, put it higher in the list. That is the wrong axis, because everybody's own work is important and a scale where everything is at the top is not a scale.</p>
<p>The useful question is not how important a message is. It is <strong>what it asks the reader to do.</strong> There are only three answers.</p>
<ul><li>Nothing. You should know this happened. Read it whenever.</li><li>Later. Look at this next time you are looking at things.</li><li>Now. Somebody is standing still until you act.</li></ul>
<p>A signature request is always the third. It is not information about work; it is a request for a specific person's hand, and until that hand moves, a document, a payment and usually another human being are all stopped. It now has its own type, sitting on the row for things awaiting approval, and it says plainly that it asks for an act. It arrives on its own and it rings. It also says which page of the document the signature goes on, because "sign this" without "here" is still a small piece of homework.</p>
<h2 id="why-nobody-reported-it">Why nobody reported it<a class="anchor" href="#why-nobody-reported-it" aria-label="Link to this section">#</a></h2>
<p>This is the part that makes it our kind of problem.</p>
<p>The person who had to sign did not know there was anything to report. From where they stood, nothing had happened. The person who sent it assumed it had landed, because sending it had produced no error and the software said it had gone. Both of them held a completely consistent picture of the day, and the two pictures did not overlap at the point where the work was stuck.</p>
<p>That is the most durable kind of gap. It has no owner, because nobody experiences it as a gap. It gets discovered the way this one did: somebody asks why a thing has not moved, and the answer turns out to be that nobody was ever told to move it.</p>
<h2 id="defaults-are-decisions">Defaults are decisions<a class="anchor" href="#defaults-are-decisions" aria-label="Link to this section">#</a></h2>
<p>Every routing table has a default, and a default is a decision made once, in the abstract, by somebody who was not thinking about your document. It then applies to every message that will ever be classified into that row, for years, without being revisited, because nothing about it ever looks like a choice again. It looks like the way things are.</p>
<p>That is why the fix was not to make the alert louder. Loudness is a resource with a fixed supply. An application that rings for everything is an application people mute, and a muted application delivers nothing at all. Quiet is a feature, and the bulletin row is doing real work for the messages that genuinely belong to it.</p>
<p>The fix was to stop lying about what the message wanted. Once a request says "this asks somebody to act", the routing follows on its own and no one has to argue about priority.</p>
<h2 id="the-general-shape">The general shape<a class="anchor" href="#the-general-shape" aria-label="Link to this section">#</a></h2>
<p>If something in your work regularly waits on a person who did not know they were being waited on, the problem is unlikely to be that person. Look at how the request was categorised on its way to them, and ask what else shares that category. You will usually find one bucket carrying two kinds of message: the kind that is nice to know, and the kind that is holding up a room. They cannot share a delivery rule, however tidy it looks in the table.</p>
<p>The general form of the routing rule is set out in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>, and the wider habit of never revisiting a setting made once is <a href="https://be-teck.com/blog/defaults-are-decisions/">a default is a decision somebody made once</a>.</p>
<p>Everything else in this class is the same. We wrote about <a href="https://be-teck.com/blog/the-gap-you-stopped-noticing/">the gap you stopped noticing</a> before we had this example. This is what one looks like from the inside.</p>]]></content:encoded></item>
<item><title>A fact that had no owner</title><link>https://be-teck.com/blog/a-fact-that-had-no-owner/</link><guid isPermaLink="true">https://be-teck.com/blog/a-fact-that-had-no-owner/</guid><pubDate>Tue, 01 Sep 2026 15:00:00 +0530</pubDate><description>A payment made in instalments was invisible to half an application, because one plain fact was being worked out separately by every screen that needed it.</description><category>gaps</category><category>money</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>An order was paid. Not in one movement: an advance first, then the balance some weeks later. Every rupee had gone. The people who paid it knew it was paid.</p>
<p>And a queue inside our own software kept asking for it to be paid again.</p>
<h2 id="why-it-happened">Why it happened<a class="anchor" href="#why-it-happened" aria-label="Link to this section">#</a></h2>
<p>The record of <em>this is paid</em> was a single date stamp on the task. Paying in stages does not write that stamp, and that is not a bug: when a payment has a schedule, the stages <strong>are</strong> the payment record. There is nothing missing.</p>
<p>So any screen that asked "is the paid date set?" was blind to every rupee that had ever moved in instalments. One screen asking the wrong question is an ordinary defect. What we actually found was the same question being asked all over the application, in place after place, each in its own words, each written by somebody who reasonably assumed the stamp meant what it looked like it meant.</p>
<p>Four of them were queues and counters: the list of payments cleared to pay, the list waiting for a signature, the number in the sidebar, and the sweep that puts a decision back in front of somebody who has already made it.</p>
<p>Five more were found afterwards, and one of them was expensive.</p>
<h2 id="the-one-that-cost-people-time">The one that cost people time<a class="anchor" href="#the-one-that-cost-people-time" aria-label="Link to this section">#</a></h2>
<p>A material line on an order paid in stages sat at "waiting on payment" forever. That stage of the journey has a chaser attached to it, and the chaser rings Finance every three days.</p>
<p>So Finance was being reminded, every three days, about money that had already left the account.</p>
<p>Nobody reported it. That is the part worth sitting with. It is not that somebody noticed and was ignored. It is that a recurring reminder which is occasionally wrong teaches you to skim the whole class of reminder, and once you skim it, the one that matters costs the same as the ones that do not. The chaser was not merely useless here. It was quietly spending the credibility of every other chaser in the building.</p>
<h2 id="the-one-that-could-have-stopped-a-lorry">The one that could have stopped a lorry<a class="anchor" href="#the-one-that-could-have-stopped-a-lorry" aria-label="Link to this section">#</a></h2>
<p>The same stale question was being asked at the gate. The guard's list of loads to expect refuses any line whose money has not settled, which is sensible. A load paid to the last rupee in stages carried no stamp, so it never reached the list, and a lorry that had been fully paid for arrived at the barrier unannounced.</p>
<p>That is the exact event the screen exists to prevent. It had been prevented in every case except the ones paid in the way the biggest orders are paid.</p>
<h2 id="the-fix-is-not-one-fix-per-screen">The fix is not one fix per screen<a class="anchor" href="#the-fix-is-not-one-fix-per-screen" aria-label="Link to this section">#</a></h2>
<p>Writing the correct condition into each of those places would have produced a copy of a rule per screen, which is the same problem again with a longer fuse on it. There is now one function that answers "has the money for this actually settled?", living in the file that owns payment schedules, with a mirror of it in the database query language beside it so the two cannot drift apart. Every surface asks it. None of them owns a second opinion.</p>
<p>One detail from the repair is worth stating plainly, because it is the least comfortable thing we found.</p>
<p><strong>One of our own regression tests was holding the bug in place.</strong> The test that guarded the "this is paid, close it?" prompt was anchored on the stale date stamp, because at the time it was written that was what the code said. It passed happily while the prompt failed to appear on exactly the orders it was built for. A test that describes the code rather than the rule will defend a defect as loyally as it defends a feature, and it will do it while reporting green.</p>
<h2 id="the-shape">The shape<a class="anchor" href="#the-shape" aria-label="Link to this section">#</a></h2>
<p>Any fact your work depends on that is computed in more than one place will eventually disagree with itself. It will not disagree loudly. Nothing crashes. Two screens simply say different things about the same order, on the same morning, and each person takes the answer from whichever screen they happen to be standing in front of.</p>
<p>It survives because everybody's own view of it stays consistent. The person in Finance sees an unpaid order and chases. The person who paid it sees a paid order and does not understand the fuss. Neither of them is looking at a contradiction; they are looking at their own screen, which agrees with itself.</p>
<p>If you want to find these in your own tools, do not look for error messages. Look for a fact that several teams each know how to check, and ask each of them to describe the check out loud. The gap is the difference between their answers. It is usually the case nobody enumerated: the part payment, the cancelled order, the one that was settled a different way.</p>
<p>A fact worth trusting has one owner. Everything else asks it.</p>
<p>The same structure, described for anybody running a purchase ledger rather than a codebase, is in <a href="https://be-teck.com/blog/staged-payments-and-accounting/">why staged payments break accounting systems</a>. The test that was holding this particular bug in place has its own piece: <a href="https://be-teck.com/blog/a-test-that-defends-a-bug/">a test that describes the code will defend a bug</a>.</p>]]></content:encoded></item>
<item><title>How we find our own problems</title><link>https://be-teck.com/blog/how-we-find-our-own-problems/</link><guid isPermaLink="true">https://be-teck.com/blog/how-we-find-our-own-problems/</guid><pubDate>Tue, 01 Sep 2026 14:00:00 +0530</pubDate><description>Nothing here starts with a market report — it starts with hitting the same wall for the tenth time. Notice, build, keep alive, and why stage three decides it.</description><category>how-we-work</category><category>gaps</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>There is no research function here. No survey, no market sizing, no slide that says <em>the opportunity</em>. Every single thing BE Teck has built came from the same place: somebody inside the group hit a wall for the tenth time and finally refused to walk around it.</p>
<p>That sounds casual. It is actually the most demanding sourcing method there is, because it means we can only work on problems we are ourselves standing in. We find our problems by living them.</p>
<p>There are three stages, and they are not equal.</p>
<h2 id="notice-name-it-out-loud">Notice — name it out loud<a class="anchor" href="#notice-name-it-out-loud" aria-label="Link to this section">#</a></h2>
<p>Noticing is the hard part, and it is hard for a reason that has nothing to do with intelligence. Any problem that survives longer than about a month stops being experienced as a problem. It gets absorbed into the description of the job. Ask somebody what is broken and they will tell you what broke <em>this week</em>; the thing that has been broken for three years does not come up, because it has stopped being an event and become the weather.</p>
<p>So the only reliable move is to say it out loud, in plain words, to another person: <em>this step exists because of nothing.</em> Naming it is what converts a tolerated condition back into a problem, and until that happens no amount of engineering will help, because nobody has agreed there is anything to fix.</p>
<p>The three rules then decide whether it is ours. Is it real, is it big enough to matter, and is it something worth doing regardless of whether it makes money. Most things fail the second rule and that is fine — small annoyances can wait.</p>
<h2 id="build-the-smallest-honest-fix">Build — the smallest honest fix<a class="anchor" href="#build-the-smallest-honest-fix" aria-label="Link to this section">#</a></h2>
<p>The word carrying the weight is <strong>honest</strong>, not small.</p>
<p>Small is easy and usually wrong: a shortcut, a button, a script somebody has to remember to run. That is another workaround, and workarounds are what we are here to remove, so shipping one is not a win.</p>
<p>Honest means the fix addresses the actual cause rather than the symptom somebody complained about. Sometimes the honest fix is one field on one screen. Sometimes it is an instrument. What is not allowed is a fix that looks finished while the gap is still there — a page that renders, a demo that completes, a pilot that quietly dies once the person who cared moves on.</p>
<p>The field test is the only test that counts. Not the demo, and not the happy path: a full working day, in the real place, on a bad connection, with the people who will actually use it and none of the people who built it standing nearby. If it cannot survive that, it is not finished, and it does not get called built.</p>
<h2 id="keep-alive-we-run-what-we-build">Keep alive — we run what we build<a class="anchor" href="#keep-alive-we-run-what-we-build" aria-label="Link to this section">#</a></h2>
<p>This is the stage almost everybody skips, and it is the one that makes the other two mean something.</p>
<p>We run what we build. The same people who closed a gap stay responsible for it being closed next month. Nothing gets handed to a maintenance team, declared done, and then slowly rots while the people who understood it move on to more interesting work.</p>
<p>Consequences of that rule, in order of how uncomfortable they are:</p>
<ul><li>Everything built is a permanent liability, so <strong>we build less</strong>. The question is never just <em>can we?</em> but <em>are we willing to run this for years?</em></li><li>Bad decisions come back to their authors. There is no distance between design and consequence, which is the cheapest quality mechanism ever invented.</li><li>Total volume is capped by capacity to keep things alive. That cap is the point, not a limitation.</li></ul>
<p>It also closes the loop, because running something is the single best way to notice the next gap. The people operating an instrument every day are the ones who see the thing it still cannot do. Stage three feeds stage one, which is why the method does not run out of material.</p>
<h2 id="what-this-method-cannot-do">What this method cannot do<a class="anchor" href="#what-this-method-cannot-do" aria-label="Link to this section">#</a></h2>
<p>It is worth being clear about the cost. Problems nobody in the group experiences are invisible to us. This method has excellent taste about problems we live with and no opinion at all about problems we do not, which is a genuine blind spot and not a modest one.</p>
<p>The only fix for it is other people describing their own walls. If something in your daily work is broken in a way everybody has stopped complaining about, that is exactly what we want to hear — <a href="mailto:hello@be-teck.com">hello@be-teck.com</a>.</p>
<p>Two of the method's rules have been written up on their own since: <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>, which decides what we are willing to let software do unattended, and <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is actually for</a>, which decides what has to survive after it has done it.</p>]]></content:encoded></item>
<item><title>The five instruments of Kshetron</title><link>https://be-teck.com/blog/the-five-instruments-of-kshetron/</link><guid isPermaLink="true">https://be-teck.com/blog/the-five-instruments-of-kshetron/</guid><pubDate>Tue, 01 Sep 2026 09:00:00 +0530</pubDate><description>Terrex, Classic, Kaagaz, Tempo and BEAi — what each instrument of Kshetron is for, and why land in India needed them assembled into one readable surface.</description><category>kshetron</category><category>what-we-built</category><category>land</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Buy, sell, build or lend against land in India, and at some point somebody hands you a stack of paper. Titles, mutations, approvals, encumbrance records, site reports, agreements. Each document is genuine. Each came from a system that was designed on its own, with no knowledge that the others existed.</p>
<p>The stack is the problem. Not any one document in it — the fact that a human being has to hold all of them in their head at once and decide whether they agree with each other.</p>
<p>Kshetron rebuilt that stack as <strong>one readable surface</strong>. It is not a portal that links to other portals. It is five instruments that share the same ground.</p>
<h2 id="terrex-the-flagship-interface-for-the-field">Terrex — the flagship interface for the field<a class="anchor" href="#terrex-the-flagship-interface-for-the-field" aria-label="Link to this section">#</a></h2>
<p>Terrex is the one you stand in a field with. It is the full instrument: the place where land, its records and the work happening on it are held together, built for people who are outdoors, on a phone, and often on a connection that comes and goes.</p>
<p>Terrex sets the standard the other four are measured against, which is why it carries the platform's own green.</p>
<h2 id="classic-the-proven-simpler-way-in">Classic — the proven, simpler way in<a class="anchor" href="#classic-the-proven-simpler-way-in" aria-label="Link to this section">#</a></h2>
<p>Not everyone needs the full instrument, and not every day is a full-instrument day. Classic is the simpler, proven way in: fewer moving parts, less to learn, and the same underlying records.</p>
<p>Keeping Classic alive is a deliberate choice. A new interface that forces everybody through it on day one is not a fix, it is a second problem. Classic is the door that was already open, kept open.</p>
<h2 id="kaagaz-documents-drafted-and-signed">Kaagaz — documents, drafted and signed<a class="anchor" href="#kaagaz-documents-drafted-and-signed" aria-label="Link to this section">#</a></h2>
<p><em>Kaagaz</em> means paper, and that is the joke and the job. It is where a document is drafted, checked, agreed and signed, so that the paper stops being an artefact that lives in somebody's drawer and starts being part of the record.</p>
<p>The gap Kaagaz closes is the one between <em>the deal everyone agreed to</em> and <em>the document that says so.</em> Those two things drift apart constantly, and the drift is where disputes are born. What makes a signed document worth signing is <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evidence rather than tamper-proofing</a>.</p>
<h2 id="tempo-people-work-and-money-kept-in-time">Tempo — people, work and money, kept in time<a class="anchor" href="#tempo-people-work-and-money-kept-in-time" aria-label="Link to this section">#</a></h2>
<p>Tempo is the internal instrument: who is working, on what, and what has been paid. Attendance, tasks, approvals, invoices and the money that moves against them.</p>
<p>The name is the whole design brief. Almost nothing in an organisation fails because a fact was unknown. It fails because the fact arrived late — the approval after the payment, the payment after the deadline, the deadline after the excuse. Tempo's job is timing.</p>
<h2 id="beai-a-closed-world-assistant-that-cites-its-sources">BEAi — a closed-world assistant that cites its sources<a class="anchor" href="#beai-a-closed-world-assistant-that-cites-its-sources" aria-label="Link to this section">#</a></h2>
<p>BEAi answers questions about the estate's own material, and the two words that matter are <strong>closed world</strong>. It does not roam. It answers from what it has been given, and it shows you where the answer came from.</p>
<p>An assistant that produces a confident paragraph with no provenance is worse than no assistant, because it manufactures certainty at exactly the moment somebody needs to check. Citation is not a feature bolted on. It is the reason this one was allowed to exist.</p>
<h2 id="five-colours-one-family">Five colours, one family<a class="anchor" href="#five-colours-one-family" aria-label="Link to this section">#</a></h2>
<p>Each instrument owns one colour so the family reads at a glance — Terrex green, Classic amber, Kaagaz violet, Tempo pink, BEAi yellow. Look at any screen for half a second and you know which instrument you are in before you have read a single word.</p>
<p>That is not styling. In an estate where a person moves between five tools in a morning, colour is the fastest possible orientation, and getting oriented slowly is itself one of the gaps.</p>
<h2 id="seeing-them">Seeing them<a class="anchor" href="#seeing-them" aria-label="Link to this section">#</a></h2>
<p>Each instrument has a public preview: a working-feeling interface with no real data in it. The real thing sits behind a gate, because it holds real records about real people and real land, so <em>preview</em> is the honest word for what is open.</p>
<ul><li><a href="https://kshetron.co.in/preview?p=terrex" target="_blank" rel="noopener">Terrex</a></li><li><a href="https://kshetron.co.in/preview?p=classic" target="_blank" rel="noopener">Classic</a></li><li><a href="https://kshetron.co.in/preview?p=kaagaz" target="_blank" rel="noopener">Kaagaz</a></li><li><a href="https://kshetron.co.in/preview?p=tempo" target="_blank" rel="noopener">Tempo</a></li><li><a href="https://kshetron.co.in/preview?p=beai" target="_blank" rel="noopener">BEAi</a></li></ul>
<p>A longer view from the outside is at <a href="https://kshetron.co.in/about" target="_blank" rel="noopener">kshetron.co.in/about</a>.</p>]]></content:encoded></item>
<item><title>What a delivery challan is, and what it proves</title><link>https://be-teck.com/blog/what-is-a-delivery-challan/</link><guid isPermaLink="true">https://be-teck.com/blog/what-is-a-delivery-challan/</guid><pubDate>Tue, 01 Sep 2026 08:20:00 +0530</pubDate><description>A delivery challan travels with the goods and says what left the seller's gate. It is not a bill, and on its own it is not proof that anything arrived.</description><category>materials</category><category>stores</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A lorry arrives. The driver climbs down and hands somebody a slip of paper, usually creased, usually in triplicate, usually carbon-copied so faintly that the quantity is the hardest thing on it to read.</p>
<p>That slip is a delivery challan. It is one of the most important documents in construction and one of the least carefully handled, and the reason is that almost everybody treats it as a receipt when it is nothing of the sort.</p>
<h2 id="what-is-actually-written-on-it">What is actually written on it<a class="anchor" href="#what-is-actually-written-on-it" aria-label="Link to this section">#</a></h2>
<p>A delivery challan is the seller's statement of what left their premises. In its ordinary form it carries the date, a serial number, the consignor and the consignee, the vehicle number, a description of the goods, the quantity, and somewhere near the bottom a space for a signature at the other end.</p>
<p>Under the GST rules a delivery challan is the right document for movements where a tax invoice is not — goods sent out for job work, goods sent on approval, a single order delivered in several vehicles, material moved between two of your own premises. In those cases the challan is not a lesser version of an invoice. It is the correct paper for that movement, and the invoice comes later or not at all.</p>
<h2 id="what-it-proves">What it proves<a class="anchor" href="#what-it-proves" aria-label="Link to this section">#</a></h2>
<p>It proves dispatch. Somebody at the other end loaded a stated quantity into a stated vehicle on a stated day and wrote it down.</p>
<p>That is genuinely valuable. It fixes a date, it fixes a vehicle, and it fixes a number that the seller cannot later quietly revise, because you are holding their own copy of it. It cuts both ways, which is why it is worth writing <a href="https://be-teck.com/blog/a-challan-that-protects-the-supplier/">a challan that protects the supplier</a> if you are the one dispatching.</p>
<h2 id="what-it-does-not-prove">What it does not prove<a class="anchor" href="#what-it-does-not-prove" aria-label="Link to this section">#</a></h2>
<p>It does not prove that the quantity written on it is the quantity that reached your store.</p>
<p>This is the whole point, and it is the part people skip because the paper looks so official. The challan was written at the loading point. Between there and your gate a load can be short, wet, broken, partly delivered somewhere else, or simply counted differently by two people using two methods. A challan signed at your gate proves the driver got a signature. It does not, by itself, prove agreement about quantity.</p>
<p>The document that records what <em>you</em> say arrived is a different document, and it is written by your side. That is the <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt note</a>, and keeping the two separate is the foundation everything else in purchase accounting is built on.</p>
<h2 id="why-the-difference-matters-at-the-gate">Why the difference matters at the gate<a class="anchor" href="#why-the-difference-matters-at-the-gate" aria-label="Link to this section">#</a></h2>
<p>The gate is where a challan is either turned into a record or lost.</p>
<p>If the person at the barrier signs the challan, hands back the top copy and keeps a carbon that goes into a spike file, you have a stack of paper and no data. Six weeks later, when an invoice arrives for a quantity nobody remembers, the only way to check it is to send somebody to the spike file.</p>
<p>If instead the gate writes the challan number, the vehicle number and its own count into a register at the moment the lorry is standing there, the challan becomes checkable. We have written separately about what makes <a href="https://be-teck.com/blog/a-gate-register-people-keep/">a gate register somebody will actually keep</a>, because the difficulty is never that people do not understand why it matters. It is that the register was designed by somebody who has never held a pen in one hand and a torch in the other.</p>
<h2 id="a-challan-filed-against-nothing">A challan filed against nothing<a class="anchor" href="#a-challan-filed-against-nothing" aria-label="Link to this section">#</a></h2>
<p>Here is a failure we found in our own software, because it is a good illustration of how this document gets lost even after it has been captured correctly.</p>
<p>Site staff were photographing delivery slips and sending them in. The photographs were being read, the challan details extracted, and each one offered a match against the purchase it belonged to. All of that worked.</p>
<p>But the matcher only ever considered purchases that had <strong>not</strong> yet been paid. In our own process, payment is required before a lorry is dispatched at all. So by the time material arrived and somebody photographed the slip, the correct purchase was always in the paid state, and therefore was never offered as a candidate. The challan matched nothing. And a challan filed against nothing is displayed on no screen anywhere, which means that from the outside it looks exactly like a challan that was never captured.</p>
<p>Nothing errored. The photographs kept arriving, the reading kept working, and the result kept being invisible. The fix was one sentence long: paid purchases are offered the match too, closed ones still are not.</p>
<h2 id="what-to-do-with-one-in-order">What to do with one, in order<a class="anchor" href="#what-to-do-with-one-in-order" aria-label="Link to this section">#</a></h2>
<ol><li><strong>Count before you sign.</strong> The signature is the moment your side commits. Everything after it is an argument.</li><li><strong>Write your own number down</strong>, even when it is the same as theirs. Especially when it is the same as theirs.</li><li><strong>Keep the challan number.</strong> It is the only handle that connects the physical arrival to the paperwork that follows — the receipt note, and later the invoice.</li><li><strong>Note the vehicle number.</strong> Disputes about deliveries are very often disputes about which delivery, and the vehicle is what separates them.</li><li><strong>Photograph it before it goes into the file.</strong> Paper on a construction site has a survival rate nobody would accept from any other record.</li></ol>
<p>Then, when the invoice appears, you have three independent statements of the same event — what was ordered, what was delivered, and what is being charged — and you can hold them against each other. That comparison is <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a>, and it is the only reliable defence against paying for material that never arrived.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A delivery challan is the seller's word about what left. Your goods receipt note is your word about what came. An invoice is the seller's claim about what you owe. Three documents, three authors, one event.</p>
<p>Treat any of them as a substitute for the others and you have quietly agreed to pay for whatever the vendor writes down.</p>]]></content:encoded></item>
<item><title>What a goods receipt note is, and why it is not the challan</title><link>https://be-teck.com/blog/what-a-goods-receipt-note-is/</link><guid isPermaLink="true">https://be-teck.com/blog/what-a-goods-receipt-note-is/</guid><pubDate>Tue, 01 Sep 2026 08:10:00 +0530</pubDate><description>The GRN is your own record of what arrived, written by your side. Confuse it with the vendor's challan and you have no independent check on anything.</description><category>stores</category><category>materials</category><category>procurement</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A goods receipt note is the store's statement of what it actually received.</p>
<p>That is the entire definition, and every useful property of a GRN follows from one word in it: <strong>own</strong>. The challan is the vendor's document. The invoice is the vendor's document. The GRN is yours. It is the only one of the three written by somebody whose interest is in the number being right rather than being high.</p>
<h2 id="what-goes-on-it">What goes on it<a class="anchor" href="#what-goes-on-it" aria-label="Link to this section">#</a></h2>
<p>At minimum: the date and time of receipt, who received it, the purchase or work order it belongs to, the vendor, the material, the quantity your side counted, the unit that quantity is in, the vehicle, and the <a href="https://be-teck.com/blog/what-is-a-delivery-challan/">delivery challan number</a> it corresponds to.</p>
<p>Then two fields that are usually missing and matter more than most of the above:</p>
<ul><li><strong>The condition.</strong> Broken bags, wet cement, bent bars, short by three pieces. If there is nowhere to write it, it will be written nowhere.</li><li><strong>Whether it was accepted, rejected or accepted in part.</strong> A GRN that can only say "received" cannot describe the most common awkward case, which is a load you take in and argue about afterwards.</li></ul>
<h2 id="why-the-vendors-paper-cannot-do-this-job">Why the vendor's paper cannot do this job<a class="anchor" href="#why-the-vendors-paper-cannot-do-this-job" aria-label="Link to this section">#</a></h2>
<p>Consider what happens if you skip the GRN and simply post the challan quantity into stock, which is what a great many organisations do because it is faster.</p>
<p>Your stock now says exactly what the vendor said it should say. The vendor's invoice will also say what the vendor said. So the invoice will agree with your stock perfectly, every time, including on the deliveries that were short. You have built a check that cannot fail, which is the same thing as no check at all.</p>
<p>The GRN exists to introduce a second, independent number into the process. That independence is not paperwork. It is the mechanism.</p>
<h2 id="where-grns-go-wrong">Where GRNs go wrong<a class="anchor" href="#where-grns-go-wrong" aria-label="Link to this section">#</a></h2>
<p><strong>It is written later, from the challan.</strong> Somebody collects the day's slips and enters them in the evening, copying the vendor's quantities. The document now exists and the independence does not. If the GRN is not written at the point and moment of receipt, by the person who counted, it is a transcription, not a receipt.</p>
<p><strong>Nobody records the unit.</strong> Twelve of what? Bags, tonnes, running feet, cubic metres, pieces. A store that holds one material in two units will eventually be wrong about it, which is a big enough problem on its own that we wrote about <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure and where it leaks money</a>.</p>
<p><strong>There is no way to correct one.</strong> This is the most damaging of the three, because it converts a small error into a permanent one.</p>
<h2 id="the-undo-that-did-not-exist">The undo that did not exist<a class="anchor" href="#the-undo-that-did-not-exist" aria-label="Link to this section">#</a></h2>
<p>A storekeeper types the wrong quantity into a receipt. It happens the way every typing mistake happens: at the end of a long afternoon, on a phone, with a lorry waiting.</p>
<p>In our own system there was, for a long time, no way to undo it. The number stayed wrong. The correction happened on paper, in a note, and in the memory of the one person who knew which entry was the bad one.</p>
<p>When we came to fix that, we found the code to reverse a stock entry already existed. It had been written. It had no callers — no button, no menu item, no route anywhere in the application. And wiring it up turned out not to be safe: six separate faults had to be repaired first, including one reader of stock positions that never checked the cancelled flag at all, so a reversed receipt would have gone on counting for ever.</p>
<p>The full account is in <a href="https://be-teck.com/blog/written-and-never-wired/">the piece on code that was written and never wired</a>. The part that belongs here is why nobody had ever asked for the button: because a workaround existed and it worked. Somebody knew how to make the number look right again with a second entry and a note. Within months that was simply how a wrong receipt got fixed. The gap had not closed. It had been staffed.</p>
<h2 id="how-a-correction-should-work">How a correction should work<a class="anchor" href="#how-a-correction-should-work" aria-label="Link to this section">#</a></h2>
<p>Not by editing the original row. A receipt that can be edited is a receipt nobody can rely on, because the number you are reading today is not necessarily the number that was entered.</p>
<p>The correct shape is two rows written in one movement: the original marked cancelled, and a reversing entry of the opposite sign which is itself born cancelled. A reader that filters out cancelled rows sees neither. A reader that forgets to filter sees both, and both add to zero. The answer is right under either reading, which is what you want when you cannot personally audit every piece of code that will ever count your stock.</p>
<p>Add two more things and it is finished: state the effect in numbers before acting — <em>the store reads this much, cancelling this leaves that much</em> — and require a reason that actually reaches the record. A cancellation with no stated reason is an unexplained hole in the stock ledger, and unexplained holes are what audits are made of.</p>
<h2 id="what-a-good-grn-buys-you">What a good GRN buys you<a class="anchor" href="#what-a-good-grn-buys-you" aria-label="Link to this section">#</a></h2>
<p>Once your side has an independent, timestamped, correctable record of what arrived, three things become possible that were not possible before.</p>
<p>You can hold the invoice against it, which is <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a> and is the single largest source of recovered money in purchase accounting.</p>
<p>You can hold your book stock against physical stock, and when they disagree you have dated entries to walk back through rather than a shrug. The wider version of that disagreement is <a href="https://be-teck.com/blog/the-site-to-head-office-gap/">why the site's numbers and the office's diverge</a>.</p>
<p>And you can answer the question a vendor asks six weeks later — <em>are you saying we short-delivered you?</em> — with a document written on the day by the person who counted, rather than with an opinion.</p>
<p>The vendor's paper says what they sent. Yours says what you got. Keep both.</p>]]></content:encoded></item>
<item><title>Three-way matching, and the case it always misses</title><link>https://be-teck.com/blog/three-way-matching/</link><guid isPermaLink="true">https://be-teck.com/blog/three-way-matching/</guid><pubDate>Tue, 01 Sep 2026 08:00:00 +0530</pubDate><description>Order, receipt, invoice. Hold the three against each other before you pay. The method is simple; the failures are all in the cases nobody enumerated.</description><category>procurement</category><category>accounts</category><category>stores</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Three-way matching is the practice of not paying an invoice until three independent documents agree about the same event.</p>
<ul><li><strong>The purchase order.</strong> What we agreed to buy, at what rate, in what unit.</li><li><strong>The goods receipt note.</strong> What our side says arrived.</li><li><strong>The invoice.</strong> What the vendor says we owe.</li></ul>
<p>Each is written by a different person at a different moment with a different interest. That is the entire value of the method. If any two of them were written by the same side, the check that compares them proves nothing.</p>
<h2 id="what-you-are-actually-comparing">What you are actually comparing<a class="anchor" href="#what-you-are-actually-comparing" aria-label="Link to this section">#</a></h2>
<p>Not just the total. The total is the least informative number on an invoice, because two errors of opposite sign hide inside it perfectly.</p>
<p>Match line by line, and match four things per line:</p>
<ol><li><strong>The material.</strong> The same item, not a similar one.</li><li><strong>The quantity.</strong> Invoice against receipt, not invoice against order — the order is what you wanted, the receipt is what came.</li><li><strong>The rate.</strong> Invoice against order, because the rate was agreed in advance and the delivery has no opinion about it.</li><li><strong>The unit.</strong> The most quietly expensive of the four. A rate agreed per tonne and invoiced per quintal is a factor of ten, and it looks like a perfectly ordinary line.</li></ol>
<p>Then the arithmetic: quantity times rate, plus tax, equals the line total. Invoices are typed by people and the arithmetic is wrong more often than anyone expects.</p>
<h2 id="the-three-ordinary-outcomes">The three ordinary outcomes<a class="anchor" href="#the-three-ordinary-outcomes" aria-label="Link to this section">#</a></h2>
<p><strong>All three agree.</strong> Pay it.</p>
<p><strong>Receipt is less than invoice.</strong> The vendor is charging for material that did not arrive, or arrived short. This is what the method exists to catch. It is also where you find out whether your <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt notes</a> were really written by your side or copied off the vendor's challan, because if they were copied this case can never occur.</p>
<p><strong>Receipt is more than invoice.</strong> More arrived than is being charged for. Do not simply pay the lower figure and enjoy it. Either a second invoice is coming for the balance, or somebody has delivered to the wrong site, and both are better discovered now than at year end.</p>
<h2 id="the-tolerance-question">The tolerance question<a class="anchor" href="#the-tolerance-question" aria-label="Link to this section">#</a></h2>
<p>Nobody blocks a payment over a rupee. So a tolerance is set: a small percentage or absolute value inside which the three are treated as agreeing.</p>
<p>Two things about tolerances are worth stating plainly.</p>
<p>The tolerance must be <strong>defined once, centrally, and visible</strong>. A tolerance that each approver applies by judgement is not a tolerance, it is permission to approve anything.</p>
<p>And it must apply to the <em>difference</em>, not to the <em>total</em>. A tolerance expressed as a percentage of a large invoice is a large number of rupees, which means the checks get weakest exactly where the money is biggest. That is the wrong way round.</p>
<h2 id="where-the-method-actually-fails">Where the method actually fails<a class="anchor" href="#where-the-method-actually-fails" aria-label="Link to this section">#</a></h2>
<p>Not on the comparison. The arithmetic is easy. It fails on the cases nobody listed when the process was designed.</p>
<p><strong>Partial deliveries.</strong> One order, five lorries, five receipts, one invoice. Now the match is many-to-one and every naive implementation either refuses it or matches against the first receipt and reports a shortfall that is not real.</p>
<p><strong>One delivery, several orders.</strong> A vendor consolidates. The reverse problem.</p>
<p><strong>Free material, samples, replacements.</strong> A load arrives with a receipt and will never have an invoice. If your process requires an invoice for every receipt, these sit open for ever and eventually somebody is told to ignore that queue, which kills the queue for everything.</p>
<p><strong>Rate revisions mid-order.</strong> The order says one rate, a later agreement says another, and the agreement lives in a WhatsApp message. The match will fail correctly and for a reason nobody can find.</p>
<p><strong>Payment before delivery.</strong> This one breaks more systems than the rest combined, and we broke ours with it.</p>
<h2 id="the-one-we-got-wrong">The one we got wrong<a class="anchor" href="#the-one-we-got-wrong" aria-label="Link to this section">#</a></h2>
<p>In our own process, money often has to move before a lorry will be dispatched. That is a commercial reality, not a policy choice.</p>
<p>Our software matched an incoming delivery challan against open purchases — and the matcher considered only purchases that had <strong>not</strong> been paid. So by the time material actually arrived, the correct purchase was always in the paid state, and was therefore never a candidate. The challan matched nothing, and a challan matched to nothing appears on no screen at all.</p>
<p>The three-way match was structurally impossible for the exact class of order it mattered most for. Nothing failed loudly. The photographs kept arriving and the result kept being invisible.</p>
<p>A related fault sat on the money side of the same process. A payment made in stages — an advance, then a balance — never wrote the field that meant <em>this is paid</em>, because when a payment has a schedule the stages <strong>are</strong> the payment record. Every query that asked "is the paid date set?" was blind to every rupee that had moved in instalments. That story is <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>, and its lesson is the same as this one: the rule was right and the enumeration of cases was incomplete.</p>
<h2 id="asking-rather-than-blocking">Asking rather than blocking<a class="anchor" href="#asking-rather-than-blocking" aria-label="Link to this section">#</a></h2>
<p>There is a temptation, once you have a match, to make it a gate: no match, no payment.</p>
<p>We came to a different arrangement, and it has held up. On every payment awaiting signature the system says either <em>delivery challans filed</em> or, in amber, <em>no delivery challan yet — money before material?</em></p>
<p>It is a question, not a block. Some payments rightly precede material, and the person signing is entitled to know they are making that choice rather than having it made for them. A hard block on a legitimate case teaches people to find the override, and once the override is habitual you have neither a block nor a question. It has a cost at the other end of the transaction too, where the same three documents decide <a href="https://be-teck.com/blog/getting-paid-on-time/">whether a contractor is paid on time</a>.</p>
<p>That distinction — between a system that refuses and a system that <a href="https://be-teck.com/blog/the-machine-proposes/">proposes and lets a person decide</a> — turns out to matter far more than the strictness of the rule itself.</p>
<h2 id="what-to-check-on-your-own-process">What to check on your own process<a class="anchor" href="#what-to-check-on-your-own-process" aria-label="Link to this section">#</a></h2>
<p>Take one order that was delivered in parts and paid in stages. Follow it end to end and ask, at each step, which document the system compared against which.</p>
<p>If you cannot find three independently authored numbers, you do not have three-way matching. You have a form.</p>]]></content:encoded></item>
<item><title>How to read a bill of quantities</title><link>https://be-teck.com/blog/reading-a-bill-of-quantities/</link><guid isPermaLink="true">https://be-teck.com/blog/reading-a-bill-of-quantities/</guid><pubDate>Tue, 01 Sep 2026 07:50:00 +0530</pubDate><description>A BOQ is a priced list of the work, written so that two people can compete on the same job. Reading one well is mostly knowing what it deliberately leaves out.</description><category>materials</category><category>money</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A bill of quantities is a list of every item of work on a project, each with a described scope, a unit, a quantity, a rate and an amount.</p>
<p>Its purpose is comparison. If two contractors are given the same list of items with the same quantities in the same units, then their totals mean something when set side by side, because they are pricing the same thing. Without it, every quotation is a different shape and comparing them is guesswork dressed up as procurement.</p>
<p>That is the whole idea. Everything difficult about a BOQ comes from the gap between that idea and a real site.</p>
<h2 id="the-anatomy-of-a-line">The anatomy of a line<a class="anchor" href="#the-anatomy-of-a-line" aria-label="Link to this section">#</a></h2>
<p>A single BOQ line has five parts, and people usually read two of them.</p>
<p><strong>The item code.</strong> Boring, and the most useful thing on the page. It is what lets you follow one item from the estimate through the bill through the measurement sheet to the payment certificate. If your codes change between documents you have no thread to pull, and the same requirement on the accounts side is <a href="https://be-teck.com/blog/cost-heads-that-survive-a-project/">cost heads that survive a project</a>.</p>
<p><strong>The description.</strong> The actual contract. This is where the argument will happen. "Providing and laying" is a different scope from "laying". A description that names what is included and does not name what is excluded has told you very little.</p>
<p><strong>The unit.</strong> Cubic metre, square metre, running metre, tonne, number, kilogram, quintal, lump sum. Read this before the rate, every time. A rate is meaningless without it, and mixed units within a bill are one of the most reliable sources of dispute there is — enough that we wrote about <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure and where it leaks money</a> on its own.</p>
<p><strong>The quantity.</strong> Estimated, not guaranteed. More on this below, because it is the single biggest misunderstanding.</p>
<p><strong>The rate.</strong> What the contractor is willing to do one unit of that item for, including everything the description says is included.</p>
<h2 id="the-quantity-is-an-estimate">The quantity is an estimate<a class="anchor" href="#the-quantity-is-an-estimate" aria-label="Link to this section">#</a></h2>
<p>This is the thing to internalise.</p>
<p>In most forms of measured contract, the quantities in a BOQ are the designer's best estimate of what the drawings imply. They are there so that tenders can be compared. They are not an order for that much work, and the contractor is not entitled to be paid for them if less work happens.</p>
<p>What gets paid is what gets <strong>measured</strong>, at the agreed rate, when the work is done. The bill provides the rate; the site provides the quantity.</p>
<p>This is why the difference between the quantity on paper and the quantity on the ground is a normal condition rather than a scandal — and also why it must be recorded rather than argued about later. That difference has its own piece: <a href="https://be-teck.com/blog/measured-and-docketed-quantity/">why measured and docketed quantities disagree</a>.</p>
<h2 id="reading-for-what-is-missing">Reading for what is missing<a class="anchor" href="#reading-for-what-is-missing" aria-label="Link to this section">#</a></h2>
<p>An experienced reader spends most of their attention on absence.</p>
<ul><li><strong>Is the preliminaries section priced, or spread?</strong> Site establishment, supervision, temporary works and insurance have to be paid for somehow. A contractor who prices them at nearly nothing has loaded them into the rates, which is fine as long as you know, and expensive to discover later if the quantities move.</li><li><strong>Which items have suspiciously high rates against small quantities?</strong> This is front-loading, and it is entirely rational behaviour. If a contractor expects a quantity to grow, they price that item high. Look at the items where the design is least settled.</li><li><strong>What has no line at all?</strong> The most costly omissions are the ones with no row to notice. Dewatering, shoring, disposal of excavated material, cutting and making good, testing. If it is not an item and not explicitly in a description, somebody will claim it as extra, and they will usually be right.</li><li><strong>Is there a provisional sum or a prime cost sum?</strong> These are placeholders for work that is not yet designed or priced. They are honest devices, but they are not commitments, and a total that leans heavily on them is a total that has not been fixed.</li></ul>
<h2 id="the-rate-is-not-the-price">The rate is not the price<a class="anchor" href="#the-rate-is-not-the-price" aria-label="Link to this section">#</a></h2>
<p>A low rate on the biggest item wins tenders. Whether it survives contact with the site is a different question.</p>
<p>The useful discipline when comparing two bills is to ignore the totals for the first pass and compare rates item by item on the ten or fifteen lines that carry most of the money. Construction bills are extraordinarily top-heavy — concrete, steel, blockwork, finishes. If two bidders differ wildly on one of those lines, either one of them has misread the description or one of them knows something.</p>
<h2 id="from-the-bill-to-the-money">From the bill to the money<a class="anchor" href="#from-the-bill-to-the-money" aria-label="Link to this section">#</a></h2>
<p>The BOQ does not stop being useful once the contract is signed. It becomes the skeleton of every payment.</p>
<p>A <a href="https://be-teck.com/blog/running-account-bills/">running account bill</a> is almost always the same list of items with a new column: quantity executed this period, cumulative quantity, cumulative value, less what was already certified. The clean version of that arithmetic depends entirely on the item codes staying constant. When somebody renumbers the bill halfway through a project, every cumulative figure in the file loses its meaning and has to be rebuilt by hand.</p>
<p>Retention, deductions, advances and set-offs all sit below that same structure. So the discipline of a well-formed BOQ pays out for the whole life of the job, and a sloppy one is paid for monthly, for years.</p>
<h2 id="three-checks-worth-doing-on-any-bill-you-are-handed">Three checks worth doing on any bill you are handed<a class="anchor" href="#three-checks-worth-doing-on-any-bill-you-are-handed" aria-label="Link to this section">#</a></h2>
<ol><li><strong>Add it up yourself.</strong> Not to catch fraud. To catch a wrong formula in a spreadsheet, which is far more common and just as expensive.</li><li><strong>Pick five random lines and read the description out loud.</strong> If you cannot say what is included and what is not, neither can the person who will build it, and the gap between those two readings is the claim.</li><li><strong>Check that each unit matches its item.</strong> Reinforcement by weight, concrete by volume, formwork by contact area, painting by area, piling by length. A unit that does not match the physical nature of the work is usually a copy-paste error, and it will be found at measurement time by whichever party it favours.</li></ol>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A bill of quantities is a fair way of asking several people the same question. It is not a forecast, not an order, and not a promise about how much work there will be.</p>
<p>Read the descriptions like a contract, the units like an engineer and the quantities like an estimate, and most of the surprises stop being surprises.</p>]]></content:encoded></item>
<item><title>Concrete grades: what M25 actually means</title><link>https://be-teck.com/blog/concrete-grades-what-m25-means/</link><guid isPermaLink="true">https://be-teck.com/blog/concrete-grades-what-m25-means/</guid><pubDate>Tue, 01 Sep 2026 07:40:00 +0530</pubDate><description>The number in M25 is a characteristic strength in newtons per square millimetre at 28 days. Not an average, not a mix ratio, and not a promise about today.</description><category>concrete</category><category>materials</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Concrete is specified by grade. M20, M25, M30, M40 and upward. Everybody on a site says these numbers all day, and a surprising number of the people saying them are not certain what the number refers to.</p>
<p>It is a strength. Specifically, it is the <strong>characteristic compressive strength in newtons per square millimetre, measured on standard cubes at twenty-eight days</strong>. The M stands for mix.</p>
<p>So M25 concrete is concrete specified to reach a characteristic cube strength of 25 N/mm² at 28 days. That is the whole definition, and each part of it is doing work.</p>
<h2 id="characteristic-is-not-average">"Characteristic" is not "average"<a class="anchor" href="#characteristic-is-not-average" aria-label="Link to this section">#</a></h2>
<p>This is the part that gets skipped, and it is the most important.</p>
<p>Characteristic strength is not the mean of your test results. It is a value below which only a small proportion of results is expected to fall — the code defines it as the strength below which not more than five per cent of test results are expected to lie.</p>
<p>Concrete is a variable material made in the open air by people with buckets and lorries. Test a hundred cubes from a well-controlled batching plant and you get a spread, not a number. Specifying the <em>average</em> at 25 would mean that something close to half of your concrete is weaker than the design assumed, which is not a position any structural engineer will accept.</p>
<p>So a mix designed for M25 is targeted well <strong>above</strong> 25, by a margin that depends on how consistent that particular plant and that particular supply chain actually are. A plant with tight control needs a smaller margin. A plant with variable aggregate needs a bigger one. The margin is a statement about the process, not about the concrete.</p>
<p>Two practical consequences follow.</p>
<p><strong>A single cube result below 25 is not automatically a failure.</strong> The specification is about a distribution, and the code sets out how results are grouped and judged. A single low cube is a signal to look, not a verdict.</p>
<p><strong>A single result above 25 does not prove compliance either.</strong> People misuse this constantly in both directions.</p>
<h2 id="at-twenty-eight-days">"At twenty-eight days"<a class="anchor" href="#at-twenty-eight-days" aria-label="Link to this section">#</a></h2>
<p>Concrete continues to gain strength for a long time. Twenty-eight days is the conventional age at which it is judged, and it was chosen as a practical compromise between waiting for the strength to develop and needing an answer before the building is finished.</p>
<p>It has one very uncomfortable property: by the time you have the result, the concrete has been in the structure for four weeks and quite possibly has three floors on top of it.</p>
<p>That is why seven-day results are taken as well. They are an early indication — a bad seven-day result is a reason to stop and think, not a certification of anything. The relationship between the seven-day and twenty-eight-day figure varies with the cement, the mix and the weather, so treating it as a fixed percentage is a mistake that has led people to accept bad concrete and reject good concrete in roughly equal numbers.</p>
<p>The full mechanics of the test, and what actually goes wrong with it, are in <a href="https://be-teck.com/blog/the-concrete-cube-test/">the piece on the concrete cube test</a>.</p>
<h2 id="grade-is-not-a-mix-ratio">Grade is not a mix ratio<a class="anchor" href="#grade-is-not-a-mix-ratio" aria-label="Link to this section">#</a></h2>
<p>An older way of specifying concrete is by nominal proportions — one part cement, so many parts sand, so many parts aggregate. You will still hear these on site.</p>
<p>Nominal mixes are permitted only for the lower grades. Above that the mix has to be <strong>designed</strong>: proportions worked out for the specific materials, tested by trial, and adjusted. This is not bureaucracy. The strength of concrete depends much more on the water-cement ratio than on the cement content alone, and a nominal proportion says nothing at all about water. Two batches at the same nominal ratio, one made with a wet mix because it was easier to place, can differ enormously in strength.</p>
<p>Which is why the argument about water on site is not really an argument about workability. It is an argument about strength, conducted in the language of convenience, and it has its own piece: <a href="https://be-teck.com/blog/the-slump-test/">the slump test</a>.</p>
<h2 id="what-a-grade-does-not-tell-you">What a grade does not tell you<a class="anchor" href="#what-a-grade-does-not-tell-you" aria-label="Link to this section">#</a></h2>
<p>Grade is compressive strength and nothing else. A specification often carries several other requirements alongside it, and they are not implied by the M number:</p>
<ul><li><strong>Exposure conditions and durability.</strong> Minimum cement content, maximum water-cement ratio and minimum grade are set by how aggressive the environment is. A structure in a coastal or chemically aggressive setting has requirements that a strong-but-porous mix will not satisfy.</li><li><strong>Maximum aggregate size</strong>, which is governed by the spacing of the reinforcement and the thickness of the member.</li><li><strong>Workability</strong>, expressed as a slump range appropriate to how the concrete will be placed.</li><li><strong>Cement type</strong>, which affects heat of hydration and rate of gain.</li></ul>
<p>A load that meets the strength and misses the durability requirements has passed the test everybody watches and failed the one that decides how long the structure lasts.</p>
<h2 id="the-record-that-outlives-the-pour">The record that outlives the pour<a class="anchor" href="#the-record-that-outlives-the-pour" aria-label="Link to this section">#</a></h2>
<p>The thing nobody thinks about on the day is that the grade is a claim you may have to defend for decades.</p>
<p>For each pour, the useful record is: the date, the location in the structure, the grade specified, the quantity, the supplier or the mix used, the challan or batch reference, the slump measured on arrival, who received it, and the seven- and twenty-eight-day cube results with their identification marks.</p>
<p>Most of that is captured at the barrier, on a load the gate should already have been expecting — <a href="https://be-teck.com/blog/before-the-lorry-reaches-the-gate/">why a lorry surprises the gate</a>.</p>
<p>That is not a long list, and almost nobody has it complete. We brought eight months of concrete history into our own system from a spreadsheet and found the value was in exactly those fields — the receiving officer, the challan number, the rate, the slump, and the cube results where they had been taken. What made the import trustworthy was that it reconciled: the number of rows, the total volume, and the total value all had to reproduce the figures the register claimed before a single row was written. Two rows had to be hunted down first because a serial number was blank on one and mistyped on the other.</p>
<p>A parse that cannot reproduce the total it claims is not a parse anybody should import. The same is true of a concrete register. If the loads on the page do not add up to the volume in the structure, one of the two is wrong, and finding out which one after the fact is very expensive.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>M25 means: designed so that, at twenty-eight days, no more than a small proportion of standard cube results fall below 25 N/mm².</p>
<p>It is a statistical statement about a process, not a label on a lorry.</p>]]></content:encoded></item>
<item><title>The concrete cube test, and the four weeks you wait</title><link>https://be-teck.com/blog/the-concrete-cube-test/</link><guid isPermaLink="true">https://be-teck.com/blog/the-concrete-cube-test/</guid><pubDate>Tue, 01 Sep 2026 07:30:00 +0530</pubDate><description>Cubes are cast on site, cured, crushed and recorded. Most of what goes wrong with the test happens in the first ten minutes, long before the crushing.</description><category>concrete</category><category>records</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The cube test is how a claim about concrete is turned into evidence.</p>
<p>Concrete arrives, somebody fills a set of steel moulds from it, those cubes are cured in water, and at a stated age they are crushed in a machine that records the load at which they fail. Divide that load by the area of the face and you have a compressive strength. Compare it with what was specified and you have an answer.</p>
<p>The procedure is simple enough to describe in a paragraph. Almost everything that goes wrong with it happens in the ten minutes at the beginning, when nobody is watching.</p>
<h2 id="what-the-test-is-measuring">What the test is measuring<a class="anchor" href="#what-the-test-is-measuring" aria-label="Link to this section">#</a></h2>
<p>A cube is not the structure. It is a sample of the same material, treated as well as anybody knows how to treat it, so that its result represents the best the concrete could do.</p>
<p>That is a deliberate choice and it has a consequence people find counter-intuitive: a cube result tells you about the <strong>concrete as supplied</strong>, not about the concrete as placed. Poor compaction, poor curing and bad weather in the structure are real problems that a perfect cube result will not reveal. The cube answers one question — was the material we were given capable of the specified strength — and it answers it well. It answers nothing else.</p>
<h2 id="the-first-ten-minutes">The first ten minutes<a class="anchor" href="#the-first-ten-minutes" aria-label="Link to this section">#</a></h2>
<p><strong>The sample must be representative.</strong> Taken from the discharge of the load, not from the first splash and not from the scrapings at the end. A sample taken from the wrong part of a load is a test of something that was never in the structure.</p>
<p><strong>The moulds must be right.</strong> Clean, correctly sized, properly oiled, and assembled so the faces are square. A distorted mould gives a cube with a face that is not flat, which changes how the load is applied and therefore what number comes out.</p>
<p><strong>Compaction has to be done properly and consistently.</strong> Air voids left in a cube reduce its strength substantially. A cube that was rodded half-heartedly because the person was in a hurry will fail, and the failure will be blamed on the supplier.</p>
<p><strong>They must be marked.</strong> This is the one that ruins whole months of testing. A cube with no identification, or with an identification that has washed off in the curing tank, is a result belonging to nothing. It cannot be attached to a pour, a location, a grade or a supplier. It is a number with no owner, and the only honest thing to do with it is discard it — which means the pour it came from has no test at all.</p>
<h2 id="curing-is-where-the-argument-starts">Curing is where the argument starts<a class="anchor" href="#curing-is-where-the-argument-starts" aria-label="Link to this section">#</a></h2>
<p>Cubes are cured in water at a controlled temperature until they are tested. That is the standard condition, and it exists so that results from different sites are comparable.</p>
<p>It also means the cubes are treated better than the structure almost always is. Somebody will point this out, usually when a result is disappointing, usually in the form "the cubes were not cured the same way as the slab". They are correct about the fact and wrong about what it implies. The cube is a control sample. Its job is to hold everything constant except the concrete. If you cure cubes the way the slab was cured, you have measured the curing, not the concrete, and you have lost the only comparable number you had.</p>
<p>If the concern is the structure rather than the supply, that is a different test — cores taken from the actual member, or non-destructive methods — and those come with their own corrections and their own arguments.</p>
<h2 id="seven-days-and-twenty-eight-days">Seven days and twenty-eight days<a class="anchor" href="#seven-days-and-twenty-eight-days" aria-label="Link to this section">#</a></h2>
<p>Twenty-eight days is the age at which concrete is judged. Seven-day cubes are taken as an early warning.</p>
<p>The temptation is to convert one into the other with a fixed ratio. Resist it. The relationship depends on the cement, the mix, the admixtures and the temperature, and the range across ordinary construction is wide enough that a fixed factor will cause both false alarms and false comfort.</p>
<p>What a seven-day result is genuinely good for: telling you that something is badly wrong, four weeks earlier than you would otherwise know. A seven-day result far below what that mix has historically produced is a reason to stop pouring from that source and find out why. It is not, by itself, a rejection.</p>
<h2 id="what-a-failing-result-actually-means">What a failing result actually means<a class="anchor" href="#what-a-failing-result-actually-means" aria-label="Link to this section">#</a></h2>
<p>Not much, on its own. Compliance is assessed on groups of results against criteria set out in the code, not on individual cubes, precisely because the material is variable and the test has its own scatter.</p>
<p>The sequence when results are unsatisfactory is investigative rather than punitive: check the test itself, check the records for that batch, then if necessary move to tests on the structure. Skipping straight from one low cube to demolition, or from one low cube to a shrug, are the two commonest errors and they are made by different people for the same reason — neither has understood that the specification is a statement about a distribution.</p>
<p>The grade specification itself, and why it is a statistical claim rather than a label, is explained in <a href="https://be-teck.com/blog/concrete-grades-what-m25-means/">what M25 actually means</a>.</p>
<h2 id="the-record-is-the-deliverable">The record is the deliverable<a class="anchor" href="#the-record-is-the-deliverable" aria-label="Link to this section">#</a></h2>
<p>A cube test produces a number. The value of that number is entirely a function of what it can be attached to.</p>
<p>Each result needs, at minimum: the date the cubes were cast, the date tested, the identification mark, the grade, the pour and its location in the structure, the supplier or batching source, the challan or batch reference, the slump recorded on arrival, and the load at failure.</p>
<p>Without the pour location, you cannot answer the only question that ever gets asked later: <em>is the concrete in this particular column all right?</em> Without the challan reference you cannot connect the result to a load, and therefore cannot connect it to a supplier or to a payment. That connection is what makes cube results into something more than a filing exercise, and it is the same connection that makes a <a href="https://be-teck.com/blog/what-is-a-delivery-challan/">delivery challan</a> worth capturing properly in the first place.</p>
<p>When we imported eight months of a concrete register into our own system, the fields that turned out to carry the value were exactly these — the receiving officer, the challan number, the rate, the slump, and the seven- and twenty-eight-day results where they had been taken. The rows without them were not wrong. They were just no longer evidence of anything. They are also among the few unrepeatable items in <a href="https://be-teck.com/blog/the-handover-file/">what belongs in a handover file</a>, because nobody can cast a cube for a pour made three years ago.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The crushing machine is the least interesting part of the cube test.</p>
<p>Sample properly, compact properly, mark the cube so the mark survives a month under water, cure it to the standard condition even when somebody objects, and record the result against the pour it came from.</p>
<p>Do those five things and the number means something. Miss any one of them and you have spent four weeks producing a figure you cannot use.</p>]]></content:encoded></item>
<item><title>The slump test, and why water is the real argument</title><link>https://be-teck.com/blog/the-slump-test/</link><guid isPermaLink="true">https://be-teck.com/blog/the-slump-test/</guid><pubDate>Tue, 01 Sep 2026 07:20:00 +0530</pubDate><description>Slump measures how far fresh concrete settles when its mould is lifted. It takes two minutes, and it is the only check between you and a weaker structure.</description><category>concrete</category><category>materials</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A truncated steel cone is filled with fresh concrete in layers, each layer rodded, the top struck off level. The cone is lifted straight up. The concrete settles. The distance the top of it drops, measured in millimetres, is the slump.</p>
<p>That is the entire test. It takes about two minutes and needs a cone, a rod, a flat plate and a ruler. It is the cheapest quality check on any construction site and one of the most frequently skipped.</p>
<h2 id="what-it-is-measuring">What it is measuring<a class="anchor" href="#what-it-is-measuring" aria-label="Link to this section">#</a></h2>
<p>Workability. How easily the concrete can be placed and compacted without segregating.</p>
<p>Slump is not strength, and it does not measure strength. What makes it important is that the easiest way to increase slump on site is to add water, and adding water reduces strength. So slump is the observable that stands in front of the invisible thing you actually care about.</p>
<p>A specification will name a slump range appropriate to the work: stiffer for something that must hold its shape, wetter for a heavily reinforced section where the concrete has to flow between bars. Both the top and the bottom of that range matter. Too low and it will not compact, leaving voids. Too high and either water has been added or the mix has been designed wet, and in the first case the strength has already gone.</p>
<h2 id="the-argument-in-its-usual-form">The argument, in its usual form<a class="anchor" href="#the-argument-in-its-usual-form" aria-label="Link to this section">#</a></h2>
<p>Concrete arrives. Somebody looks at it and says it is too stiff to place. A hose appears. Two buckets of water go in, the drum turns, and the load becomes much easier to handle.</p>
<p>Everybody in that conversation is behaving reasonably. The person placing the concrete has a real problem — stiff concrete in a congested section genuinely will not compact, and badly compacted concrete is also weak. The driver wants to discharge and leave. Nobody involved is trying to weaken the building.</p>
<p>What has happened is that a decision about strength has been made by the person holding the hose, on the basis of how the mix looks, with no record.</p>
<p>The correct answer is almost never water. It is either an admixture, which is what admixtures exist for, or a mix designed for the placement conditions in the first place, or a different pour sequence. All of those require somebody to have thought about it before the lorry arrived.</p>
<h2 id="where-and-when-to-test">Where and when to test<a class="anchor" href="#where-and-when-to-test" aria-label="Link to this section">#</a></h2>
<p>At the point of discharge, from the load you are about to place, before it goes in. Not at the plant, not from the first spill, and not after water has been added — which sounds obvious and is the most common way the test is defeated.</p>
<p>There is a timing subtlety worth knowing: concrete loses slump as it stands. A load tested an hour after batching will read lower than the same load at the plant, without anybody having done anything wrong. If the site is a long way from the plant or the truck queued, that loss is real and expected. The specification and the mix design have to accommodate it, which is a conversation with the supplier and not a reason for a hose.</p>
<h2 id="reading-the-shape-not-just-the-number">Reading the shape, not just the number<a class="anchor" href="#reading-the-shape-not-just-the-number" aria-label="Link to this section">#</a></h2>
<p>The way the concrete slumps tells you something the ruler does not.</p>
<ul><li>A <strong>true slump</strong>, where the mass settles evenly and keeps its shape, is what you want to see.</li><li>A <strong>shear slump</strong>, where one side slides off, suggests a mix that is not cohesive. The number is unreliable and the test should be repeated.</li><li>A <strong>collapse</strong>, where it spreads out flat, means the mix is far too wet for this test to say anything useful about it.</li></ul>
<p>Two loads can produce the same reading with completely different behaviour in the shutter. Somebody who has watched a hundred slump tests learns more from the four seconds after the cone lifts than from the measurement.</p>
<h2 id="why-it-is-skipped">Why it is skipped<a class="anchor" href="#why-it-is-skipped" aria-label="Link to this section">#</a></h2>
<p>Because it is the only quality check that costs the site something at the exact moment it is performed.</p>
<p>Everything else about concrete quality is checked later or elsewhere. The cube test happens now and reports in four weeks, so it costs nothing today. The slump test happens now, reports now, and its result may require somebody to reject a load with a queue of lorries behind it and a gang standing idle.</p>
<p>That is the honest reason it does not get done. Not ignorance. A test that can stop work is a test people find reasons not to run, and the reasons are always credible on the day.</p>
<h2 id="making-it-survive-contact-with-a-real-site">Making it survive contact with a real site<a class="anchor" href="#making-it-survive-contact-with-a-real-site" aria-label="Link to this section">#</a></h2>
<p>The only version of this that works is one where recording a slump is easier than not recording it, and where somebody other than the person under pressure sees the number.</p>
<p>That means the slump belongs on the same record as the load itself — the same row that carries the challan number, the vehicle, the grade, the volume and the receiving officer. That row is written at the barrier, which is why it matters what the gate has been told before the lorry arrives — <a href="https://be-teck.com/blog/before-the-lorry-reaches-the-gate/">why a lorry surprises the gate</a>. Not in a separate register that a separate person keeps. A field on a form that already has to be filled costs nothing to fill; a second register costs a walk to the office, and the walk is what actually decides whether it happens.</p>
<p>It also means the number has to be visible afterwards. A slump reading that disappears into a file is a reading that only ever gets looked at during a dispute. Held beside the grade and the <a href="https://be-teck.com/blog/the-concrete-cube-test/">cube results for the same load</a>, it becomes something else: the first place anybody looks when a twenty-eight-day result comes back low. High slump on arrival and a poor cube result four weeks later is a pattern that explains itself, and you can only see the pattern if the two numbers live in the same place.</p>
<p>This is a small instance of a much more general point about site records — that a record which requires an extra journey is a record that exists in theory. We have written about the same problem in the context of <a href="https://be-teck.com/blog/a-gate-register-people-keep/">a gate register somebody will actually keep</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Slump is a two-minute measurement of workability that stands in for the thing you cannot see, which is how much water went into the concrete.</p>
<p>Test at discharge, before anything is added. Watch the shape as well as the ruler. Write the number on the same row as everything else about that load.</p>
<p>And when somebody reaches for a hose, understand what is actually being decided, and by whom.</p>]]></content:encoded></item>
<item><title>Why measured and docketed quantities disagree</title><link>https://be-teck.com/blog/measured-and-docketed-quantity/</link><guid isPermaLink="true">https://be-teck.com/blog/measured-and-docketed-quantity/</guid><pubDate>Tue, 01 Sep 2026 07:10:00 +0530</pubDate><description>The number on the docket and the number your side measures are rarely identical. Most of the gap is ordinary physics and method. Some of it is not.</description><category>materials</category><category>stores</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A load arrives with a figure written on the paperwork. Your side measures it and gets a different figure.</p>
<p>This happens constantly, on every site, with every material, and the ordinary response is to treat it as either a rounding matter or an accusation. It is usually neither. The gap between the docketed quantity and the measured quantity has half a dozen ordinary causes, and knowing which one you are looking at is the difference between a conversation and a dispute.</p>
<h2 id="the-two-numbers-are-answers-to-different-questions">The two numbers are answers to different questions<a class="anchor" href="#the-two-numbers-are-answers-to-different-questions" aria-label="Link to this section">#</a></h2>
<p>The docket says what the seller loaded, measured by the seller's method, at the seller's premises, at dispatch.</p>
<p>Your measurement says what your side counted, by your method, at your gate, on arrival.</p>
<p>Written like that, it would be surprising if they always matched. Same material, two places, two times, two methods, two people, each with a reason to round in a particular direction.</p>
<h2 id="the-ordinary-causes">The ordinary causes<a class="anchor" href="#the-ordinary-causes" aria-label="Link to this section">#</a></h2>
<p><strong>Different methods of measurement.</strong> Steel bought by weight and counted by piece. Sand ordered by volume and delivered by a lorry whose capacity is nominal. Aggregate weighed at a weighbridge against aggregate estimated from the height in the body. Each method has a tolerance and the two tolerances do not overlap neatly.</p>
<p><strong>Moisture.</strong> Sand and aggregate carry water, and the amount changes with the weather and with how long the stockpile has been standing. A load weighed after rain weighs more and contains no more usable material. If one end weighs and the other counts volume, this alone will produce a persistent, seasonal, completely honest discrepancy.</p>
<p><strong>Bulking.</strong> Damp sand occupies more volume than the same sand dry or saturated. A truck body that holds a certain volume holds a different mass depending on condition. Volumetric measurement of sand is unreliable for exactly this reason, and everybody knows it, and it is done anyway because it is quick.</p>
<p><strong>Losses in transit.</strong> Spillage, dust, breakage in bagged material, a bag split on the tailgate. Real, small, and not usually anybody's fault.</p>
<p><strong>Timing of the count.</strong> Material counted as it comes off, versus counted after it is stacked, versus counted the following morning from a heap. Each further step adds a chance to lose or double-count.</p>
<p><strong>Partial delivery.</strong> One order, several vehicles. If the docket is written for the order and the arrival is one vehicle, the two figures are not comparable at all and the whole comparison is a category error.</p>
<h2 id="the-causes-that-are-not-ordinary">The causes that are not ordinary<a class="anchor" href="#the-causes-that-are-not-ordinary" aria-label="Link to this section">#</a></h2>
<p>Deliberate short delivery exists. So does a weighbridge that reads generously for a particular customer, and material sold twice.</p>
<p>The useful point is that you cannot tell these apart from the ordinary causes by looking at a single delivery. A one-off gap is noise. What identifies the other kind is <strong>pattern</strong>: the same vendor, the same vehicle, the same driver, the same direction of error, over time.</p>
<p>Which means the entire diagnostic capability depends on whether your measured quantities were recorded at all. If your <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt notes</a> were written by copying the vendor's docket — as they very often are, because it is faster — then every gap is zero, the pattern cannot exist, and you have no way of knowing which of the two situations you are in.</p>
<h2 id="record-the-gap-do-not-resolve-it">Record the gap, do not resolve it<a class="anchor" href="#record-the-gap-do-not-resolve-it" aria-label="Link to this section">#</a></h2>
<p>The instinct when the two numbers differ is to pick one and write it down. This is the wrong move and it is nearly universal.</p>
<p>Both numbers are facts. The docketed quantity is a fact about what the seller says they sent. The measured quantity is a fact about what your side counted. Writing down only one of them destroys information that cannot be recovered later, and the information destroyed is precisely the information a pattern is made of.</p>
<p>The right shape is three fields: docketed, measured, and the difference — with a place for a reason when somebody knows one. <em>Short by two bags, one split on tailgate</em> is a complete and useful record, and the supplier has the same interest in it being written on his own copy at the gate — <a href="https://be-teck.com/blog/a-challan-that-protects-the-supplier/">the challan that protects the supplier</a>. <em>Received: 98</em> is not, because next month nobody can tell whether it was ordered as 98 or ordered as 100.</p>
<p>We arrived at the same conclusion on the money side of the business, from a completely different direction. When a payment is made for less than the agreed amount, the system now asks why before it accepts, and the shortfall and its reason land on the record together. The agreed figure stays reconstructible as paid plus deducted. That story is <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a>, and the principle is identical: a difference with a reason is information, and a difference silently absorbed is a number nobody can ever explain again.</p>
<h2 id="which-number-should-stock-be-posted-at">Which number should stock be posted at<a class="anchor" href="#which-number-should-stock-be-posted-at" aria-label="Link to this section">#</a></h2>
<p>The measured one. Always.</p>
<p>Stock is a claim about what is physically present. The docket is a claim about what was dispatched. Posting the docketed quantity into stock means your stock ledger is a copy of your vendors' dispatch notes, which is a fine record of what you were told and a poor record of what you have.</p>
<p>The docketed figure still matters — it is what the invoice will be based on, and reconciling those two is the entire purpose of <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a>. But it belongs on the purchase side of the ledger, not the stock side.</p>
<h2 id="what-to-do-about-a-persistent-gap">What to do about a persistent gap<a class="anchor" href="#what-to-do-about-a-persistent-gap" aria-label="Link to this section">#</a></h2>
<ol><li><strong>Check the method first.</strong> Nine times in ten, a systematic gap is a systematic difference in how the two sides measure, and it is fixed by agreeing a method rather than by an argument about honesty.</li><li><strong>Agree a tolerance in writing, per material.</strong> Cement in bags and sand by the lorry do not deserve the same tolerance and should not be given one.</li><li><strong>Fix the measuring point.</strong> Same place, same equipment, same stage of unloading, every time. Most gaps that look like theft are two people measuring at different moments.</li><li><strong>Then look at the pattern.</strong> After the first three, whatever is left is worth a conversation with the vendor, and you will have dated records to have it with.</li></ol>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Two different people measured two different things at two different moments. Of course the numbers differ.</p>
<p>Write both down. Write the difference down. Write the reason down when there is one. The gap is not the problem; the gap with no record is.</p>]]></content:encoded></item>
<item><title>Running a site store so the numbers survive</title><link>https://be-teck.com/blog/running-a-site-store/</link><guid isPermaLink="true">https://be-teck.com/blog/running-a-site-store/</guid><pubDate>Tue, 01 Sep 2026 07:00:00 +0530</pubDate><description>A site store is a warehouse run in mud by one person under pressure. Four disciplines keep its numbers usable; everything else is a matter of preference.</description><category>stores</category><category>site</category><category>materials</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A site store is a warehouse with none of a warehouse's advantages. It is temporary, often outdoors, staffed by one person who is also doing three other jobs, and its contents are removed by people in a hurry who consider paperwork an obstacle to actual work.</p>
<p>Most advice about store management assumes conditions that a site does not have. What follows is the part that survives.</p>
<h2 id="four-things-in-order-of-importance">Four things, in order of importance<a class="anchor" href="#four-things-in-order-of-importance" aria-label="Link to this section">#</a></h2>
<p><strong>Everything in is recorded at the moment it comes in.</strong> Not that evening, not from the pile of challans. The record has to be made by the person who counted, while they are counting.</p>
<p><strong>Everything out is recorded against something.</strong> A project, a location, a work item, a person. Material that leaves the store to no destination is material that has left your knowledge, and no amount of stocktaking afterwards will tell you where it went.</p>
<p><strong>Every material has exactly one unit.</strong> One. Not "bags, or tonnes when it comes loose".</p>
<p><strong>Corrections are entries, not edits.</strong> A number that can be quietly changed is a number nobody can rely on.</p>
<p>Get those four and the store is manageable. Miss any one and you are running a guessing operation with a ledger attached.</p>
<h2 id="why-the-issue-side-is-the-one-that-fails">Why the issue side is the one that fails<a class="anchor" href="#why-the-issue-side-is-the-one-that-fails" aria-label="Link to this section">#</a></h2>
<p>Receipts get recorded because there is a lorry, a driver, a challan and somebody waiting for a signature. The event has ceremony. It is hard to miss — provided the barrier knew the load was coming, which is the subject of <a href="https://be-teck.com/blog/before-the-lorry-reaches-the-gate/">why a lorry surprises the gate</a>.</p>
<p>Issues have none of that. A carpenter needs six sheets of ply and takes six sheets of ply. Somebody needs another two bags of cement at four in the afternoon. There is no external party, no paper, and nobody standing there waiting. So the issue register gets written up "later", and later is where site records go to die.</p>
<p>The consequence is systematic and always in the same direction: <strong>book stock is higher than physical stock</strong>, because receipts are complete and issues are not. Then a stocktake shows a shortfall, and the shortfall gets called wastage or pilferage, when a large part of it is simply issues that were never written down.</p>
<p>If you are going to be strict about one half of a store, be strict about the half that leaves.</p>
<h2 id="make-the-issue-cheap-to-record">Make the issue cheap to record<a class="anchor" href="#make-the-issue-cheap-to-record" aria-label="Link to this section">#</a></h2>
<p>Two things make an issue register work.</p>
<p><strong>It must be doable by the person taking the material, where they are standing.</strong> A register kept in a cabin that requires a walk is a register filled in from memory at the end of the day. A phone in the storekeeper's hand is worth more than a beautifully designed book on a desk.</p>
<p><strong>It must accept the way people already talk.</strong> People do not say "issue quantity six, unit number, material plywood 12mm". They say "6 ply gaya, second floor". A record that demands a form's vocabulary gets a form's compliance rate.</p>
<p>We learnt this the hard way in our own tools. Our software recognised a photograph from site as a delivery only if the caption contained one of four words — challan, bilty, GRN, delivery. Measured against four hundred captions the site team had actually sent, those four words matched exactly two. What people really wrote was the material and a quantity, or the name of the vehicle that brought it, or a plain list of items. Reading those three shapes instead took the match rate from two to thirty-four out of the same four hundred.</p>
<p>The vocabulary was not the site's problem. It was ours. There is a longer piece about that in <a href="https://be-teck.com/blog/the-words-the-site-already-uses/">the words the site already uses</a>.</p>
<h2 id="one-unit-per-material-and-mean-it">One unit per material, and mean it<a class="anchor" href="#one-unit-per-material-and-mean-it" aria-label="Link to this section">#</a></h2>
<p>A store that records cement in bags on Monday and in tonnes on Thursday does not have a stock figure. It has two stock figures added together.</p>
<p>Choose the unit that the material is <strong>physically handled</strong> in, not the one it is bought in or the one it is consumed in. Cement in bags, because bags are what get carried. Steel in kilograms if it is weighed and in pieces if it is counted, but never both, and if that means a conversion at the receipt stage then do the conversion at the receipt stage where somebody can check it.</p>
<p>Conversions belong at the boundary, once, with the factor written down. A conversion applied ad hoc, differently, by whoever is entering that day, is the most expensive kind of error because it is invisible in every individual record and only shows up as an unexplained gap in the total. It has its own piece: <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure</a>.</p>
<h2 id="the-correction-problem">The correction problem<a class="anchor" href="#the-correction-problem" aria-label="Link to this section">#</a></h2>
<p>The storekeeper types the wrong number. It will happen. Not occasionally — regularly, because the conditions are a phone, a lorry and the end of a long afternoon.</p>
<p>What matters is what happens next. If there is no way to reverse an entry, the correction goes on paper, into a note, and into the head of the one person who remembers which entry was the bad one. That is not a hypothetical; it is what we found in our own system, where the code to reverse a stock entry had been written and had never been given a button.</p>
<p>A reversal has to do four things or it makes matters worse:</p>
<ul><li>Write a <strong>reversing entry</strong>, not an edit, so the history stays readable.</li><li>Be <strong>refused if the stock has since gone out</strong>. Reversing a receipt after most of it has been issued drives the balance below zero, silently, which is not a state a physical store can be in.</li><li>Be <strong>restricted to people entitled to do it</strong>, which is not the same as "whoever's name is on the row".</li><li><strong>Carry a reason into the record.</strong> A reversal with no stated reason is an unexplained hole, and unexplained holes are what a stocktake turns into an argument.</li></ul>
<h2 id="stocktaking-without-theatre">Stocktaking without theatre<a class="anchor" href="#stocktaking-without-theatre" aria-label="Link to this section">#</a></h2>
<p>Count often, count small, count unannounced. A full stocktake once a quarter produces one enormous unexplainable variance. Counting three materials a week produces small variances you can still trace to a week's worth of entries.</p>
<p>And when book and physical disagree, resist the urge to make the book match the floor with a single adjusting entry. Adjust, yes — but record the adjustment as its own dated entry with its own reason, so that next quarter somebody can see whether the same material keeps needing adjusting. That pattern is the actual finding. The number itself is not. There is more on this in <a href="https://be-teck.com/blog/stock-reconciliation/">physical stock against book stock</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A site store fails on the way out, not the way in.</p>
<p>Make issues as easy to record as receipts are, fix one unit per material, never edit a number that has already been read by somebody, and count small and often.</p>
<p>The rest is shelving.</p>]]></content:encoded></item>
<item><title>Wastage on site: allowance, loss and arithmetic</title><link>https://be-teck.com/blog/wastage-on-site/</link><guid isPermaLink="true">https://be-teck.com/blog/wastage-on-site/</guid><pubDate>Tue, 01 Sep 2026 06:50:00 +0530</pubDate><description>Wastage is the difference between what you bought and what ended up in the structure. Most of it is not waste. Almost none of it is measured properly.</description><category>materials</category><category>stores</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Wastage is the difference between the quantity of material purchased and the quantity that ends up in the finished work.</p>
<p>That definition is uncontroversial and almost useless, because the difference has at least five components, they behave completely differently, and nearly every site adds them together into one number and then argues about it.</p>
<h2 id="the-five-things-inside-the-wastage-figure">The five things inside the wastage figure<a class="anchor" href="#the-five-things-inside-the-wastage-figure" aria-label="Link to this section">#</a></h2>
<p><strong>Design allowance.</strong> Some material is consumed by the nature of the work and was always going to be. Lap lengths in reinforcement. The cover that is thrown away when a bar is cut to length. Mortar joints. This is not waste in any meaningful sense; it is the difference between the theoretical quantity from a drawing and the practical quantity a builder has to buy.</p>
<p><strong>Cutting loss.</strong> Offcuts. A standard bar length divided into required lengths leaves a remainder. Good bar bending schedules and good cutting plans reduce it; nothing eliminates it.</p>
<p><strong>Handling and storage loss.</strong> Split bags, cement gone hard because it was stacked against a wall in the monsoon, aggregate lost into the mud at the bottom of a stockpile, tiles broken in transit.</p>
<p><strong>Over-ordering and over-issue.</strong> Material drawn from the store that was never needed and never returned. This is the largest component on most sites and the least discussed, because it is nobody's fault in particular.</p>
<p><strong>Loss.</strong> Material that left the site and was not used on it.</p>
<p>The first two are predictable and should be planned — and priced, because a contractor who leaves them out of his rate pays for them from profit, as <a href="https://be-teck.com/blog/quoting-a-rate-you-can-live-with/">quoting a rate you can live with</a> sets out. The third is reducible by ordinary competence. The fourth is a process failure. The fifth is a security matter. Rolling them into one percentage and comparing it to a norm tells you which of those five to work on: none of them.</p>
<h2 id="norms-are-a-starting-point-not-a-standard">Norms are a starting point, not a standard<a class="anchor" href="#norms-are-a-starting-point-not-a-standard" aria-label="Link to this section">#</a></h2>
<p>Every organisation has wastage norms for common materials, usually inherited, usually expressed as a percentage. They are useful as a first check — a figure far outside the norm is worth looking at.</p>
<p>But two cautions.</p>
<p>A norm is an average over conditions that may not be yours. Cutting loss on reinforcement depends on the member sizes and the standard lengths available; a project of small members will genuinely waste more steel than one of long spans, and no amount of discipline changes that.</p>
<p>And a norm quickly becomes a <strong>target from below</strong>. If the allowance is a certain percentage, consumption tends to rise to meet it, because nobody is questioned while they are inside the allowance. The norm stops being a control and becomes a budget.</p>
<h2 id="why-the-number-is-usually-wrong-before-anybody-analyses-it">Why the number is usually wrong before anybody analyses it<a class="anchor" href="#why-the-number-is-usually-wrong-before-anybody-analyses-it" aria-label="Link to this section">#</a></h2>
<p>To calculate wastage you need three quantities: what was purchased, what was issued, and what the work actually required.</p>
<p>The first is generally reliable, because it comes with invoices.</p>
<p>The second is not, because <a href="https://be-teck.com/blog/running-a-site-store/">site stores fail on the way out</a>. Receipts are recorded — there is a lorry and a driver and a signature. Issues are recorded later, from memory, or not at all. So the issue figure is systematically low.</p>
<p>The third is the theoretical quantity from the drawings or the measurement book, and it is only as good as the measurement.</p>
<p>Two of your three inputs are soft, and the wastage figure is a difference between them, which means the error in it is the sum of both errors. A number computed from a low issue figure and an approximate theoretical figure is not evidence of anything, and building a control regime on top of it produces arguments rather than savings.</p>
<h2 id="reconciliation-is-per-material-and-per-period">Reconciliation is per-material and per-period<a class="anchor" href="#reconciliation-is-per-material-and-per-period" aria-label="Link to this section">#</a></h2>
<p>A single site-wide wastage percentage answers no question anybody has.</p>
<p>The useful unit is one material, over one period, on one project:</p>
<ul><li>Opening stock</li><li>Plus received</li><li>Less issued</li><li>Equals closing book stock</li><li>Compared with physical stock</li></ul>
<p>Then separately: material issued, against material the measured work required.</p>
<p>Those are two different reconciliations answering two different questions. The first asks whether the store's records are right. The second asks whether the work consumed what it should have. Sites routinely conflate them, and then cannot tell a recording failure from a consumption failure — which are fixed by completely different people doing completely different things.</p>
<h2 id="the-materials-worth-being-strict-about">The materials worth being strict about<a class="anchor" href="#the-materials-worth-being-strict-about" aria-label="Link to this section">#</a></h2>
<p>Not all of them. Being equally strict about everything is a way of being strict about nothing.</p>
<p>Rank by value at risk, which is quantity times rate times how easily the material walks. On most projects that puts cement, reinforcement steel and finishes at the top, and it puts a lot of the items people fuss about near the bottom.</p>
<p>For the top three or four materials, it is worth doing the full reconciliation monthly with real counts. For the rest, a quarterly count and a sensible eye is enough. The effort saved on the tail is what pays for doing the head properly.</p>
<h2 id="measuring-loss-requires-measuring-the-ordinary">Measuring loss requires measuring the ordinary<a class="anchor" href="#measuring-loss-requires-measuring-the-ordinary" aria-label="Link to this section">#</a></h2>
<p>The uncomfortable conclusion is that you cannot detect theft on a site that does not record its ordinary consumption accurately, because theft is a residual and a residual is only visible when everything else in the equation is known.</p>
<p>This is the same structural point as <a href="https://be-teck.com/blog/measured-and-docketed-quantity/">why measured and docketed quantities disagree</a>. A gap becomes information only when the ordinary causes of that gap have been recorded and subtracted. Otherwise every gap is explicable by any of five stories and the argument goes to whoever is more persistent.</p>
<p>So the sequence is: fix the issue register, fix the units, count the top materials monthly, record differences with reasons — and only then start drawing conclusions from the residual. It is slower than everybody wants and it is the only order that works.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Wastage is five different things wearing one number.</p>
<p>Separate design allowance from cutting loss from handling loss from over-issue from actual loss, because each has a different fix and only one of them is a security problem.</p>
<p>And before you interpret the figure at all, check whether your issue records are complete. On most sites they are not, and everything downstream of them is arithmetic on a guess.</p>]]></content:encoded></item>
<item><title>The bar bending schedule, and steel by weight</title><link>https://be-teck.com/blog/the-bar-bending-schedule/</link><guid isPermaLink="true">https://be-teck.com/blog/the-bar-bending-schedule/</guid><pubDate>Tue, 01 Sep 2026 06:40:00 +0530</pubDate><description>A BBS turns drawings into a cutting list and a weight. The arithmetic is simple and the errors are systematic, which is what makes them worth understanding.</description><category>materials</category><category>site</category><category>stores</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Reinforcement is drawn as lines on a drawing and bought by weight. The bar bending schedule is the document that gets you from one to the other.</p>
<p>For every member it lists the bar mark, the diameter, the shape, the cut length, the number of bars, the total length and the weight. Added up, it is the steel order. Handed to a bender, it is the cutting list. Compared against what was delivered and what was fixed, it is the reconciliation.</p>
<p>One document doing three jobs is why errors in it are expensive: they do not show up once, they show up in the order, in the yard and in the measurement, and by the time the third one contradicts the first, three weeks have passed.</p>
<h2 id="weight-from-diameter-and-where-the-number-comes-from">Weight from diameter, and where the number comes from<a class="anchor" href="#weight-from-diameter-and-where-the-number-comes-from" aria-label="Link to this section">#</a></h2>
<p>Steel is ordered in kilograms and drawn in millimetres, so every schedule contains one conversion.</p>
<p>It is not a magic constant. Take a round bar of diameter <em>d</em> millimetres. Its cross-sectional area is π·d²/4 square millimetres. Steel has a density of about 7,850 kilograms per cubic metre. Convert the units and the mass of one metre of bar comes out as roughly <strong>d² divided by 162</strong> kilograms.</p>
<p>That is the whole derivation, and it is worth doing once rather than memorising, because then you know two things the constant alone does not tell you.</p>
<p>First, it assumes plain round section and nominal diameter. Deformed bars have ribs, and their actual mass per metre is governed by standards that permit a tolerance either side of nominal. Your bar may legitimately weigh slightly more or less than the arithmetic says.</p>
<p>Second, the tolerance is a <strong>band</strong>, and a supplier who consistently sits at one end of it is delivering consistently less steel per kilogram of invoice than one who sits at the other. Nothing improper has happened. But if you are reconciling fixed steel against purchased steel, this is a real component of the difference and it is not wastage.</p>
<h2 id="the-lengths-that-are-not-on-the-drawing">The lengths that are not on the drawing<a class="anchor" href="#the-lengths-that-are-not-on-the-drawing" aria-label="Link to this section">#</a></h2>
<p>The drawing shows where steel goes. The schedule has to show how it is cut, and several lengths appear at that step that never appeared on the drawing.</p>
<p><strong>Laps.</strong> Bars come in standard lengths and members are longer than bars. Where two bars overlap, both are consumed for the overlap distance. Lap length is a design quantity, governed by the code and by the grade of concrete and steel, and it is where a lot of steel quantity lives.</p>
<p><strong>Bends and hooks.</strong> A bar bent round a radius follows a longer path on the outside than the inside. The cut length is not the sum of the straight dimensions; standard bend deductions and hook allowances apply.</p>
<p><strong>Cover.</strong> Dimensions on a drawing are usually to the face of the concrete. The bar stops short of that face by the cover. Every dimension has to be reduced, at both ends, and forgetting it is one of the most common schedule errors — consistently producing bars slightly too long, which fit badly and quietly increase consumption.</p>
<p><strong>Chairs, spacers and support steel.</strong> Real, necessary, frequently absent from schedules, and then the site finds them from the offcut pile and the reconciliation never balances.</p>
<h2 id="where-the-schedule-and-the-site-disagree">Where the schedule and the site disagree<a class="anchor" href="#where-the-schedule-and-the-site-disagree" aria-label="Link to this section">#</a></h2>
<p>Even a perfect schedule will not match consumption, for reasons that are ordinary rather than suspicious.</p>
<p>Bars are supplied in standard lengths. Cutting a standard length into required lengths leaves an offcut. Whether that offcut is usable depends on whether a shorter bar is needed nearby, which depends on sequencing and on how tidily the yard is run. Two sites with identical schedules can differ substantially in purchased steel purely on cutting strategy, which is why that loss belongs inside the rate rather than being discovered in it — <a href="https://be-teck.com/blog/quoting-a-rate-you-can-live-with/">quoting a rate you can live with</a>.</p>
<p>Then there is revision. Drawings change. If the schedule is revised and the already-cut steel is not, you have material that fits nothing and a reconciliation that will never close.</p>
<p>This is the same category of problem as <a href="https://be-teck.com/blog/measured-and-docketed-quantity/">the gap between measured and docketed quantities</a>: an ordinary, explicable difference that becomes an argument only because nobody recorded the explanation at the time.</p>
<h2 id="the-version-control-problem">The version control problem<a class="anchor" href="#the-version-control-problem" aria-label="Link to this section">#</a></h2>
<p>A bar bending schedule is a live document on a live project, and it is very often the worst-controlled document on the site.</p>
<p>It exists as a spreadsheet. It gets emailed. Somebody at the yard has a printed copy from three weeks ago. The consultant has issued a drawing revision that the schedule has not caught up with. There is no single answer to "how much steel does this floor need", because there are four answers and they are all somebody's current file.</p>
<p>The practical minimum: every schedule carries the drawing number and revision it was prepared from, the schedule's own revision, and a date. If a bar is cut against a superseded schedule, that fact is discoverable afterwards rather than mysterious. The identifiers cost nothing and they are what makes a reconciliation possible at all.</p>
<p>The general form of this rule — that a record without a handle back to what it came from stops being evidence — is the same reason a <a href="https://be-teck.com/blog/the-concrete-cube-test/">concrete cube result needs its pour reference</a>.</p>
<h2 id="reconciling-steel-properly">Reconciling steel, properly<a class="anchor" href="#reconciling-steel-properly" aria-label="Link to this section">#</a></h2>
<p>Three quantities, per diameter, per period:</p>
<ul><li><strong>Purchased</strong>, from invoices and weighbridge slips, in kilograms.</li><li><strong>Issued from store to yard</strong>, in kilograms.</li><li><strong>Fixed in the work</strong>, from the schedule, for the members actually completed.</li></ul>
<p>The difference between the first two is a store question. The difference between the last two is a consumption question. Keep them apart — running them together produces a single unexplainable figure, which is exactly the trap described in <a href="https://be-teck.com/blog/wastage-on-site/">wastage on site</a>.</p>
<p>Do it per diameter. A site-wide steel figure hides the case that matters most, which is one diameter being over-consumed because a schedule error is repeating in every member of the same type.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A bar bending schedule is a cutting list, a purchase order and a measurement basis wearing one set of clothes.</p>
<p>The weight conversion is arithmetic you can derive rather than a constant you have to trust. The lengths that cause trouble are the ones not on the drawing — laps, bends, cover. And the errors that cost most are systematic ones, repeated in every member of a type, which is why reconciling by diameter finds things that reconciling by total never will.</p>]]></content:encoded></item>
<item><title>The unit of measure is where the money leaks</title><link>https://be-teck.com/blog/the-unit-of-measure/</link><guid isPermaLink="true">https://be-teck.com/blog/the-unit-of-measure/</guid><pubDate>Tue, 01 Sep 2026 06:30:00 +0530</pubDate><description>A rate agreed per tonne and invoiced per quintal is a factor of ten, and it looks like an ordinary line. Units are the quietest expensive error in purchasing.</description><category>materials</category><category>stores</category><category>accounts</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every quantity on every document in construction is a number and a unit, and almost every process is careful about the number.</p>
<p>The unit is where the money goes.</p>
<h2 id="why-this-particular-error-is-so-persistent">Why this particular error is so persistent<a class="anchor" href="#why-this-particular-error-is-so-persistent" aria-label="Link to this section">#</a></h2>
<p>Because it does not look like an error.</p>
<p>A wrong quantity looks wrong. Somebody ordered a hundred and got a thousand, and the person receiving it says something, because a thousand of anything arrives in a different sized vehicle.</p>
<p>A wrong unit produces a document that is internally consistent, arithmetically correct, printed neatly, and off by a factor. Quantity times rate equals amount. The line adds up. The invoice adds up. Every automated check passes. The only way to catch it is for somebody to know what a reasonable rate for that material in that unit looks like, and to be paying attention on the day.</p>
<h2 id="the-families-of-unit-error">The families of unit error<a class="anchor" href="#the-families-of-unit-error" aria-label="Link to this section">#</a></h2>
<p><strong>Straight conversion.</strong> Tonne and quintal. Metre and foot. Square metre and square foot. Litre and kilogram for anything whose density is not one.</p>
<p><strong>Nominal container units.</strong> Bag, load, trip, truck, brass. These are units in name only — they are containers whose contents vary. A "load" of sand is whatever that lorry holds, and the same word describes different volumes at two suppliers. Buying in container units and consuming in real ones is a permanent source of unexplainable variance.</p>
<p><strong>Dimensional confusion.</strong> Running metre, square metre and cubic metre for the same item at different stages. Skirting bought by length, laid by length, measured by length, but ordered by area because somebody worked off the floor plan.</p>
<p><strong>Weight against count.</strong> Steel, fasteners, fittings. Bought by weight, consumed by piece, and the conversion depends on the size — so the factor is correct for one diameter and wrong for every other.</p>
<p><strong>Packaging against contents.</strong> Twenty bags, or twenty tonnes, of the same cement. The number twenty is the same on both documents.</p>
<h2 id="the-three-places-a-unit-must-be-fixed">The three places a unit must be fixed<a class="anchor" href="#the-three-places-a-unit-must-be-fixed" aria-label="Link to this section">#</a></h2>
<p><strong>In the item master, once.</strong> One material, one stock-keeping unit. This is the first discipline of <a href="https://be-teck.com/blog/running-a-site-store/">running a site store</a> that survives contact with reality, and it is the one people compromise on first, because it seems reasonable to let cement be recorded in tonnes "when it comes loose". It is not reasonable. It means your cement balance is two numbers added together.</p>
<p><strong>On the order.</strong> The rate and the unit are agreed together and neither is meaningful alone. An order that names a rate without naming the unit it applies to is an invitation, and the invitation gets accepted at invoice time — which is the same trap seen from the side doing the pricing, <a href="https://be-teck.com/blog/quoting-a-rate-you-can-live-with/">quoting a rate you can live with</a>.</p>
<p><strong>At the conversion boundary.</strong> Where a material genuinely arrives in one unit and is held in another, do the conversion once, at receipt, with the factor written on the record. Not in the head of whoever is entering. Not differently each time. The stored factor is what makes the entry checkable a year later.</p>
<h2 id="why-unit-errors-survive-automated-checking">Why unit errors survive automated checking<a class="anchor" href="#why-unit-errors-survive-automated-checking" aria-label="Link to this section">#</a></h2>
<p>Most purchase checking compares an invoice against a receipt against an order. Done properly, this is <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a> and it catches a great deal.</p>
<p>It catches unit errors only if the unit is one of the fields compared. Very often it is not — the comparison is written to check material, quantity and rate, because those are the fields people think about. If order, receipt and invoice all carry a unit and the check ignores it, then a load ordered per tonne, received per tonne and invoiced per quintal passes cleanly, and the quantity comparison actively reassures you, because the numbers do differ by a factor and the tolerance test on the total is the only thing that might notice.</p>
<p>Add the unit to the comparison. It is one field and it closes an entire class.</p>
<h2 id="the-rate-sanity-check">The rate sanity check<a class="anchor" href="#the-rate-sanity-check" aria-label="Link to this section">#</a></h2>
<p>The cheapest defence anybody has against unit errors is a sense of what things cost.</p>
<p>If a purchase officer knows roughly what a tonne of a given material goes for, a line priced at a tenth or ten times that figure stops them, regardless of what the unit column says. This is not a system. It is a person, and it is the most effective control in most organisations.</p>
<p>Which means the system's real job is to keep that person's attention available by not spending it elsewhere. An approval queue full of routine items trains people to approve without reading, and once that habit forms the sanity check is gone. We have written about the same dynamic in the context of <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">alerts that ring for everything</a>: attention is a fixed supply, and a process that spends it on the ordinary has none left for the strange.</p>
<h2 id="where-it-shows-up-much-later">Where it shows up much later<a class="anchor" href="#where-it-shows-up-much-later" aria-label="Link to this section">#</a></h2>
<p>Unit errors are unusual in that they often do no visible damage for months.</p>
<p>The invoice is paid. Stock is posted at the wrong unit and the balance is wrong by a factor. Consumption is booked against the same wrong balance, so the error partly cancels itself in the reporting. Nothing is obviously broken.</p>
<p>Then a stocktake happens, and there is a variance of a size that cannot be explained by wastage, handling or anything else on the list in <a href="https://be-teck.com/blog/wastage-on-site/">wastage on site</a>. At that point the error is months old, spread across many transactions, and identifying it means walking back through every entry for that material.</p>
<p>That is why the discipline has to sit at the front. There is no efficient way to find a unit error afterwards.</p>
<h2 id="a-short-checklist">A short checklist<a class="anchor" href="#a-short-checklist" aria-label="Link to this section">#</a></h2>
<ol><li>Does every material have exactly one stock unit, recorded centrally?</li><li>Does every order line carry a unit next to its rate?</li><li>Does the receipt record the unit the material actually arrived in, and the converted quantity, and the factor used?</li><li>Does the invoice check compare units, not just quantities?</li><li>Does anybody in the chain know what a reasonable rate per unit looks like for the top ten materials by value?</li></ol>
<p>The fifth one is worth more than the other four together, and it is the only one that cannot be bought.</p>]]></content:encoded></item>
<item><title>Physical stock against book stock</title><link>https://be-teck.com/blog/stock-reconciliation/</link><guid isPermaLink="true">https://be-teck.com/blog/stock-reconciliation/</guid><pubDate>Tue, 01 Sep 2026 06:20:00 +0530</pubDate><description>Stock reconciliation is a comparison between what your records claim and what is actually on the ground. The variance is not the finding. The pattern is.</description><category>stores</category><category>accounts</category><category>materials</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Book stock is what your records say you have. Physical stock is what is on the ground. Reconciliation is comparing them, and it is the only thing that keeps a store's numbers honest over time.</p>
<p>Everybody knows the exercise. Rather fewer get anything useful out of it, because the exercise is usually treated as a way of producing a corrected number rather than as a way of producing information.</p>
<h2 id="the-arithmetic">The arithmetic<a class="anchor" href="#the-arithmetic" aria-label="Link to this section">#</a></h2>
<p>For one material, over one period:</p>
<blockquote><p>Opening stock, plus receipts, less issues, equals closing book stock.</p></blockquote>
<p>Count the material. The difference between that count and the closing book figure is the variance.</p>
<p>That is all the arithmetic there is. The difficulty is entirely in what the variance means and what you do with it.</p>
<h2 id="variance-is-a-residual-and-residuals-absorb-everything">Variance is a residual, and residuals absorb everything<a class="anchor" href="#variance-is-a-residual-and-residuals-absorb-everything" aria-label="Link to this section">#</a></h2>
<p>The variance is not a measurement of pilferage, or of wastage, or of anything else in particular. It is whatever is left over after every recorded event has been accounted for, which means it contains every unrecorded event of every kind:</p>
<ul><li>Issues that were never written down.</li><li>Receipts posted at a <a href="https://be-teck.com/blog/the-unit-of-measure/">wrong unit</a>.</li><li>Material returned to store and never entered.</li><li>Material transferred to another site with no paperwork.</li><li>Counting error, this time or last time.</li><li>Damage and handling loss.</li><li>Actual loss.</li></ul>
<p>Six of those seven are recording problems. The seventh is the one everybody jumps to. If your issue register is incomplete — and on most sites it is, for the reasons set out in <a href="https://be-teck.com/blog/running-a-site-store/">running a site store</a> — then your variance is dominated by the first item on that list and tells you almost nothing about the last one.</p>
<p>So the first question about any variance is not <em>where did it go</em>. It is <em>how good are the records this variance was computed from</em>.</p>
<h2 id="count-small-count-often">Count small, count often<a class="anchor" href="#count-small-count-often" aria-label="Link to this section">#</a></h2>
<p>The standard practice is a full stocktake at long intervals. It is the worst possible design.</p>
<p>A quarterly count produces one large variance covering three months of transactions, thousands of entries and several changes of personnel. It is unexplainable by construction. So it gets written off with a generic reason, and the exercise teaches nobody anything.</p>
<p>Counting a few materials every week — perpetual inventory, cycle counting, whatever your organisation calls it — produces small variances covering a small number of entries. Those are traceable. Somebody can actually walk back through a week and find the issue that was not recorded.</p>
<p>The other advantage is unpredictability. A count everybody knows the date of is a count people prepare for.</p>
<p>Rank what to count by value at risk rather than by item count: quantity times rate times how easily the material moves. The top few materials on a construction site usually carry most of the exposure, and counting them monthly while counting the tail annually is a far better use of the same hours than counting everything quarterly.</p>
<h2 id="the-adjustment-is-an-entry-not-an-edit">The adjustment is an entry, not an edit<a class="anchor" href="#the-adjustment-is-an-entry-not-an-edit" aria-label="Link to this section">#</a></h2>
<p>When the count and the book disagree, the book has to move. How that happens decides whether the exercise was worth doing.</p>
<p>The wrong way is to correct the stock figure to match the count. The number changes, the difference disappears, and next quarter nobody can tell whether this material has needed adjusting every quarter for two years.</p>
<p>The right way is a dated adjustment entry, of a stated quantity, with a stated reason, attributed to a person, sitting in the ledger alongside every other movement. The balance ends up the same. The history does not.</p>
<p>This is the store's version of a rule we hold everywhere in our own systems: <a href="https://be-teck.com/blog/append-only-records/">a correction is an entry, never an overwrite</a>. A record that can be silently revised is a record that answers today's question and no other.</p>
<h2 id="the-pattern-is-the-finding">The pattern is the finding<a class="anchor" href="#the-pattern-is-the-finding" aria-label="Link to this section">#</a></h2>
<p>One variance is noise. Materials get miscounted, entries get missed, and a single number in a single month means very little.</p>
<p>What is worth acting on:</p>
<p><strong>The same material, the same direction, repeatedly.</strong> That is a process fault — a conversion factor, a habitual unrecorded issue, a supplier who consistently delivers at one end of a tolerance.</p>
<p><strong>Variance that appears after a change.</strong> A new storekeeper, a new site layout, a new material with an unfamiliar unit. The change is the explanation and the fix is training or design, not investigation.</p>
<p><strong>Variance concentrated in one location while the same material is clean elsewhere.</strong> That narrows the question to a place and a group of people, which is the only situation in which the security conversation is well founded.</p>
<p><strong>A variance that suddenly stops.</strong> Worth as much attention as one that starts.</p>
<p>None of those is visible in a single reconciliation. They are all visible in a year of small ones, which is the argument for frequency stated a different way.</p>
<h2 id="two-things-to-stop-doing">Two things to stop doing<a class="anchor" href="#two-things-to-stop-doing" aria-label="Link to this section">#</a></h2>
<p><strong>Stop netting variances across materials.</strong> A shortfall of cement and a surplus of sand do not cancel. They are two separate facts and adding them produces a number with no meaning, which will nonetheless be reported.</p>
<p><strong>Stop netting across periods.</strong> A shortfall one month and a surplus the next usually means a timing problem — an issue recorded in the wrong period, or a receipt posted late. That is worth knowing, and it disappears entirely if you only look at the cumulative figure.</p>
<h2 id="what-a-good-reconciliation-produces">What a good reconciliation produces<a class="anchor" href="#what-a-good-reconciliation-produces" aria-label="Link to this section">#</a></h2>
<p>Not a corrected balance. You would have got that from any adjustment.</p>
<p>A good reconciliation produces a short list of specific, dated, explained differences, and a shorter list of differences nobody can explain. The second list is the output, and it is one of the things that has to be settled before the books close — <a href="https://be-teck.com/blog/month-end-at-a-builders-office/">month-end at a builder's accounts desk</a>. If it is empty every month, either your store is exceptionally well run or your counts are being reconciled to the book rather than the other way round, and it is worth knowing which.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Book minus physical is a residual, and a residual contains every unrecorded event, not just the interesting one.</p>
<p>Count small, count often, adjust by entry rather than by edit, keep materials and periods separate, and look for repetition rather than magnitude.</p>
<p>The variance is a number. The pattern is the information.</p>]]></content:encoded></item>
<item><title>Retention money is a balance, not a memory</title><link>https://be-teck.com/blog/retention-money/</link><guid isPermaLink="true">https://be-teck.com/blog/retention-money/</guid><pubDate>Tue, 01 Sep 2026 06:10:00 +0530</pubDate><description>Retention is money you have earned, been billed for, and not been paid. It is held against defects and released later, and most people track it in their heads.</description><category>money</category><category>accounts</category><category>procurement</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Retention is a portion of every payment that is deliberately not paid.</p>
<p>The contractor does the work, the work is measured, a bill is certified — and then a stated percentage of the certified amount is held back by the employer rather than paid across. It accumulates through the project. It is released later, in stages, once the work is complete and once a defect liability period has passed without the work falling apart.</p>
<p>The percentage, the cap, the timing of release and the length of the defect period are all contractual. There is no universal figure, and anybody who quotes you one without reading the contract is guessing.</p>
<h2 id="what-it-is-for">What it is for<a class="anchor" href="#what-it-is-for" aria-label="Link to this section">#</a></h2>
<p>Two things, and they are different.</p>
<p><strong>Security against defects.</strong> If something fails during the defect liability period and the contractor does not come back to fix it, the employer has money in hand to have it fixed by somebody else. That is the stated purpose and it is a reasonable one.</p>
<p><strong>Leverage for completion.</strong> Retention gives the contractor a financial reason to finish properly and to attend to a snag list. It is the part everybody understands and nobody writes down.</p>
<p>Both are legitimate. It is worth knowing which one is actually operating in a given argument, because they resolve differently.</p>
<h2 id="why-it-is-difficult-to-track">Why it is difficult to track<a class="anchor" href="#why-it-is-difficult-to-track" aria-label="Link to this section">#</a></h2>
<p>Retention has an awkward shape for an accounting system.</p>
<p>It is not a discount — the contractor earned it and it is owed. It is not an outstanding invoice — nothing further needs to be billed. It is not a liability with a fixed date — the release date depends on completion, which is an event, not a calendar entry. And it accrues in small amounts across dozens of bills over years, so it is never a single number anybody set out to record.</p>
<p>The result is almost universal: <strong>retention lives in memory</strong>. The contractor knows roughly what they are owed. The employer knows roughly what they are holding. The two figures are different and neither is written anywhere as a total until somebody asks.</p>
<p>On the contractor's side this is money already earned and often already spent on the job that generated it, and a contractor who has not priced that wait into his rate is lending it — one of the layers in <a href="https://be-teck.com/blog/quoting-a-rate-you-can-live-with/">quoting a rate you can live with</a>. On the employer's side it is a liability that does not appear anywhere obvious and then arrives all at once.</p>
<h2 id="making-it-a-balance">Making it a balance<a class="anchor" href="#making-it-a-balance" aria-label="Link to this section">#</a></h2>
<p>The design that works is to stop treating retention as a special case and treat it as <strong>a payment stage that has not fallen due yet</strong>.</p>
<p>That single move solves most of it. A payment schedule can already hold stages with amounts and dates. If a retention deduction is a stage on that schedule, marked as retention, with its date meaning the release date rather than the due date, then everything that already works for payment stages works for it: it shows up in a forward view of money owed, chasers chase it when the date nears, and releasing it is the ordinary act of marking a stage paid.</p>
<p>That is how we built it in our own system, and the reason we built it that way was to avoid inventing a second mechanism. A second mechanism means a second set of screens, a second set of rules, and a second place for the truth to live — which is the shape of problem described in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>, where the same question was being answered independently in nine places and the answers had drifted.</p>
<p>Alongside it sits the thing nobody had before: a register. Every vendor's held money, totalled in one place, sorted by release date, with past-due releases called out. Held money the company owes but is holding becomes a number anybody entitled to see it can read, rather than a memory distributed across a hundred task pages.</p>
<h2 id="the-questions-a-retention-register-has-to-answer">The questions a retention register has to answer<a class="anchor" href="#the-questions-a-retention-register-has-to-answer" aria-label="Link to this section">#</a></h2>
<p>If you are building or buying one, these are the questions. A system that cannot answer all five is not tracking retention, it is storing it.</p>
<ol><li><strong>How much are we holding in total, right now?</strong></li><li><strong>From whom, and against which contract?</strong></li><li><strong>When is each amount due for release, and on what event?</strong></li><li><strong>What has already been released, when, and who authorised it?</strong></li><li><strong>What is past its release date and still held?</strong></li></ol>
<p>The fifth one is the one that actually costs money, in both directions. Held money past its release date is money the other party is entitled to and is probably already unhappy about. From the employer's side it is a liability quietly ageing. From the contractor's side it is working capital sitting in somebody else's bank account.</p>
<h2 id="release-is-an-event-not-a-date">Release is an event, not a date<a class="anchor" href="#release-is-an-event-not-a-date" aria-label="Link to this section">#</a></h2>
<p>The most common error in a retention system is to store a release date and treat it as automatic.</p>
<p>Release is usually conditional: on practical completion, on a certificate, on the expiry of a defect period that itself starts from an event. Storing a date without storing what the date depends on means the date silently becomes wrong as soon as the programme moves — which on a construction project is immediately.</p>
<p>The workable arrangement is to store both: the condition in words, and the current expected date. When the condition is met, the date becomes real and the stage falls due. Until then the date is a forecast and should be shown as one.</p>
<p>This is a specific case of a general principle we keep returning to — <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>. A release date with no stated basis is a number people either trust wrongly or ignore entirely, and both are worse than a forecast that says what it is waiting for.</p>
<h2 id="retention-against-other-deductions">Retention against other deductions<a class="anchor" href="#retention-against-other-deductions" aria-label="Link to this section">#</a></h2>
<p>Retention is not the only thing withheld from a certified bill, and confusing the categories makes reconciliation impossible.</p>
<p>A bill may have retention held, plus statutory deductions, plus recovery of an advance, plus set-off for something the contractor owes, plus a deduction for work not accepted. These have completely different legal characters and completely different futures. Retention will be released. An advance recovery will not — it is repayment of money already paid. A deduction for short work is gone for good.</p>
<p>Lumping them into one "deductions" figure on a certificate is common and it destroys the ability to say what is owed to whom. Each needs its own line and its own running balance. The mechanics of one of them are set out in <a href="https://be-teck.com/blog/set-off/">set-off</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Retention is earned money, deliberately unpaid, held against a future condition.</p>
<p>The failure mode is not fraud. It is that nobody totals it, because it accrues in fragments and has no natural home in a ledger.</p>
<p>Give it a home — as a payment stage whose date is a release date — and it stops being a memory and starts being a balance.</p>]]></content:encoded></item>
<item><title>Running account bills, and what "running" means</title><link>https://be-teck.com/blog/running-account-bills/</link><guid isPermaLink="true">https://be-teck.com/blog/running-account-bills/</guid><pubDate>Tue, 01 Sep 2026 06:00:00 +0530</pubDate><description>An RA bill is cumulative. Each one restates the whole job to date and subtracts what was already certified, which is why the arithmetic confuses everyone.</description><category>money</category><category>accounts</category><category>site</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A running account bill is an interim payment claim on a construction contract. Work is done over months or years, and nobody waits until the end to be paid, so the contractor bills periodically for what has been done so far.</p>
<p>The word doing all the work is <strong>running</strong>. An RA bill is not a bill for this month's work. It is a restatement of the entire job to date, from which everything already certified is subtracted.</p>
<p>That distinction is the source of most of the confusion around these documents, and it is worth being precise about, because the two framings produce different numbers as soon as anything is revised.</p>
<h2 id="the-shape-of-the-arithmetic">The shape of the arithmetic<a class="anchor" href="#the-shape-of-the-arithmetic" aria-label="Link to this section">#</a></h2>
<p>For each item in the <a href="https://be-teck.com/blog/reading-a-bill-of-quantities/">bill of quantities</a>:</p>
<ul><li>Cumulative quantity executed to date</li><li>Times the agreed rate</li><li>Equals cumulative value of that item</li></ul>
<p>Sum across items to get gross cumulative value. Then, at the foot:</p>
<ul><li>Less cumulative value certified in previous bills</li><li>Equals gross value of this bill</li><li>Less retention on this bill</li><li>Less recovery of advance</li><li>Less statutory deductions</li><li>Less any set-off</li><li>Equals net payable now</li></ul>
<p>Every line above the "less previous" is cumulative. Everything below it is about this payment.</p>
<h2 id="why-cumulative-rather-than-periodic">Why cumulative rather than periodic<a class="anchor" href="#why-cumulative-rather-than-periodic" aria-label="Link to this section">#</a></h2>
<p>Because measurement is not exact, and revision is normal.</p>
<p>Suppose last month you certified a quantity that turns out, on remeasurement, to have been overstated. Under a cumulative system, this month's bill simply shows the corrected cumulative figure; the "less previous" line does the rest, and the correction flows through automatically as a smaller payment now. No credit note, no negative bill, no argument about which month the error belongs to.</p>
<p>Under a periodic system you would need an adjustment entry against a closed period, and construction contracts generate enough of those to make it unworkable.</p>
<p>The cost of the cumulative approach is that everybody has to hold two numbers in their head for every line, and people routinely quote the wrong one.</p>
<h2 id="where-cumulative-bills-break">Where cumulative bills break<a class="anchor" href="#where-cumulative-bills-break" aria-label="Link to this section">#</a></h2>
<p><strong>Item codes changing.</strong> The whole structure depends on this bill's item three being the same item as last bill's item three. Renumber the schedule midway — because scope was added, because somebody reorganised the spreadsheet — and every cumulative comparison silently becomes meaningless. The bill will still add up. It will just be adding up different things.</p>
<p><strong>Rates changing.</strong> If a rate is revised, does the revision apply to work already certified at the old rate, or only to work going forward? Both are defensible, contracts say different things, and the answer must be decided once and recorded, because a cumulative structure applies the current rate to the cumulative quantity by default — which silently reprices work that was already paid for.</p>
<p><strong>Variations and extra items.</strong> Work not in the original bill has to enter the structure somewhere. If it goes in as a lump sum at the bottom, it is outside the cumulative machinery and behaves periodically, and now the document has two different logics in it.</p>
<p><strong>Negative movement.</strong> A cumulative quantity can go down. Most systems and most people handle this badly. A bill whose net comes out negative is arithmetically correct and organisationally impossible, and what usually happens is that somebody holds it back until the next bill covers it — at which point the records no longer describe events in the order they happened.</p>
<h2 id="the-deductions-are-not-one-thing">The deductions are not one thing<a class="anchor" href="#the-deductions-are-not-one-thing" aria-label="Link to this section">#</a></h2>
<p>The lines below the gross figure are usually collapsed into a single "deductions" total on the summary page. This is convenient and it destroys information.</p>
<p>Each deduction has a different future:</p>
<ul><li><strong>Retention</strong> will be released later. It is a balance, and it needs a running total per contract. Its own mechanics are in <a href="https://be-teck.com/blog/retention-money/">retention money</a>.</li><li><strong>Advance recovery</strong> is repayment of money already handed over. It reduces an outstanding balance which must reach zero by a defined point.</li><li><strong>Statutory deductions</strong> leave your hands entirely and are remitted elsewhere. They are not yours to negotiate about.</li><li><strong>Set-off</strong> is money the other party owes you being netted against money you owe them, and it has its own consequences — <a href="https://be-teck.com/blog/set-off/">set-off</a> covers them.</li><li><strong>Disallowance</strong> — work not accepted — reduces the contract value permanently and should say why.</li></ul>
<p>Five different characters. If your certificate shows one number, then six months later nobody can reconstruct what was held and what was lost, and the final account becomes a negotiation about history rather than a calculation.</p>
<h2 id="certification-is-a-separate-act-from-billing">Certification is a separate act from billing<a class="anchor" href="#certification-is-a-separate-act-from-billing" aria-label="Link to this section">#</a></h2>
<p>A contractor submits. Somebody measures, checks and certifies. Those are different acts by different people, and an RA bill has three distinct quantities per line — claimed, measured, certified — which are not always the same.</p>
<p>Systems that store one quantity per line cannot represent a disagreement, which means the disagreement happens somewhere outside the system, usually in a meeting, and the record shows only the outcome. The contractor's file and the employer's file then contain different histories of the same project, and at final account time both are produced as evidence.</p>
<p>Storing all three costs one column. It is the cheapest dispute-avoidance measure available on a construction contract, and from the contractor's end it is also what stops a correct bill sitting unpaid — <a href="https://be-teck.com/blog/getting-paid-on-time/">getting paid on time</a>.</p>
<h2 id="the-final-account">The final account<a class="anchor" href="#the-final-account" aria-label="Link to this section">#</a></h2>
<p>Every RA bill is provisional. The final account is where the cumulative quantities become final, retention release begins, and everything held or disputed is settled.</p>
<p>The quality of that exercise is decided years earlier, by whether the interim bills kept their structure. A project whose item codes stayed constant, whose deductions were itemised, and whose claimed, measured and certified quantities were all recorded can produce a final account by arithmetic.</p>
<p>A project without those things produces one by negotiation, and negotiation favours whoever kept better records, which is a polite way of saying it favours whoever the other side cannot contradict.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>An RA bill restates the whole job and subtracts what was already certified. That is what makes corrections easy and what makes item codes sacred.</p>
<p>Keep the codes stable, keep the deductions itemised, record claimed and certified separately, and the final account becomes a calculation instead of an argument.</p>]]></content:encoded></item>
<item><title>A mobilisation advance is not an advance payment</title><link>https://be-teck.com/blog/mobilisation-advance/</link><guid isPermaLink="true">https://be-teck.com/blog/mobilisation-advance/</guid><pubDate>Tue, 01 Sep 2026 05:50:00 +0530</pubDate><description>One is a loan against future work, recovered from every bill. The other is a payment made early. Booking them the same way is how advances get paid twice.</description><category>money</category><category>procurement</category><category>accounts</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Two things in construction are both called an advance, and they behave nothing alike.</p>
<p><strong>An advance payment</strong> is money paid before delivery for a specific supply. You pay part of the value of an order up front; the material arrives; the balance is paid. The advance is part of the price of that order and is consumed by it.</p>
<p><strong>A mobilisation advance</strong> is a loan. It is given at the start of a contract so the contractor can establish the site, bring plant, hire people and buy material before any bill has been raised. It is not payment for anything. It is recovered from subsequent bills, usually as a percentage deduction from each, until the balance reaches zero.</p>
<p>The words are similar, the accounting is opposite, and the confusion is expensive.</p>
<h2 id="why-the-distinction-matters-in-the-ledger">Why the distinction matters in the ledger<a class="anchor" href="#why-the-distinction-matters-in-the-ledger" aria-label="Link to this section">#</a></h2>
<p>An advance payment against an order reduces the amount still owed on that order. If the order is worth a certain sum and part of it has been paid, the remaining liability is the difference. Straightforward.</p>
<p>A mobilisation advance creates a <strong>receivable</strong> — the contractor owes you that money back — while the contract liability remains the full contract value. Two separate balances, moving in opposite directions, over the life of a project.</p>
<p>Book a mobilisation advance as if it were an advance payment against the first bill and two things go wrong. The first bill appears largely settled when it is not. And the recovery schedule has no balance to work against, so it either never happens or happens by hand.</p>
<p>The reverse error is worse. Book an advance payment against an order as a recoverable advance and the vendor is eventually asked to repay money that was part of the price. That conversation goes badly and it is entirely your fault.</p>
<h2 id="what-a-mobilisation-advance-needs">What a mobilisation advance needs<a class="anchor" href="#what-a-mobilisation-advance-needs" aria-label="Link to this section">#</a></h2>
<p><strong>A recovery mechanism, defined at the start.</strong> Usually a percentage of each interim certificate, sometimes with a holiday at the beginning and a requirement that recovery completes before a stated point in the programme. The mechanism must be in the contract and in the system, because a recovery percentage that lives only in the contract will be forgotten by whoever prepares the third bill.</p>
<p><strong>A running balance visible on every bill.</strong> Advance given, recovered to date, outstanding. Printed on the certificate. This is one line and it removes an entire category of end-of-project surprise.</p>
<p><strong>Security, and a date on the security.</strong> Advances are commonly backed by a bank guarantee. Guarantees expire. A guarantee that expires while a substantial advance is still outstanding is no security at all, and the expiry date is the kind of thing that is diarised once, by one person, who then changes job.</p>
<p><strong>Interest terms, or an explicit statement that it is interest-free.</strong> It is a loan. Whether it carries interest is a commercial decision, and leaving it unstated means the answer is decided later by whoever argues better.</p>
<h2 id="the-recovery-that-stops-halfway">The recovery that stops halfway<a class="anchor" href="#the-recovery-that-stops-halfway" aria-label="Link to this section">#</a></h2>
<p>The common failure is not that recovery never starts. It is that it stops.</p>
<p>Recovery is a percentage of certified value. If certification slows — because the work slowed, or because a dispute paused billing — recovery slows with it. If the contract is terminated or the scope reduced, there may not be enough remaining certified value to recover the balance at all.</p>
<p>At that point you are an unsecured creditor for the outstanding advance, holding a guarantee which may or may not still be valid, in a relationship which by definition has already gone wrong.</p>
<p>The forward-looking version of this question — <em>if everything stopped today, what would we be owed and what security do we hold</em> — is one very few organisations can answer quickly, and it is the whole reason the outstanding balance needs to be a number on a screen rather than a figure in a file.</p>
<h2 id="where-advances-get-paid-twice">Where advances get paid twice<a class="anchor" href="#where-advances-get-paid-twice" aria-label="Link to this section">#</a></h2>
<p>The most direct way to lose money on advances is to pay one twice, and it happens through a mechanism that has nothing to do with carelessness.</p>
<p>An advance is paid. Later, the full order value comes up for payment, because the record of what is still owed was not reduced. Or a stage payment schedule is created after an advance has already gone out, and the schedule is written for the full amount.</p>
<p>We hit a version of this in our own software, from the other direction. A payment made in stages — an advance first, then the balance — never wrote the field that meant <em>this is paid</em>, because when a payment has a schedule the stages <strong>are</strong> the payment record. Every queue that asked "is the paid date set?" was blind to money that had moved in instalments, and a fully settled order kept appearing in the queue asking to be paid again. Nine separate screens were asking that stale question, each written by somebody who reasonably assumed the stamp meant what it looked like it meant. The full account is <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<p>Nobody paid twice, because a person noticed. But the system was asking them to, repeatedly, and a system that repeatedly asks for something wrong eventually gets it.</p>
<h2 id="two-rules-that-prevent-most-of-it">Two rules that prevent most of it<a class="anchor" href="#two-rules-that-prevent-most-of-it" aria-label="Link to this section">#</a></h2>
<p><strong>An advance must be attached to something.</strong> An order, a contract, a stage. Money that leaves the building against a vendor name and nothing else cannot be netted off later except by memory. The same rule governs the small sums a labour contractor draws mid-month against the next bill — <a href="https://be-teck.com/blog/paying-a-labour-contractor/">paying a labour contractor</a>.</p>
<p><strong>The remaining balance must be computed, never stored as an independent number.</strong> Remaining equals agreed less everything recorded as paid, worked out by one piece of logic that every screen asks. The moment two places compute it separately they will disagree, and each will be internally consistent, so nobody will notice for months.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>An advance payment is part of a price. A mobilisation advance is a loan.</p>
<p>One is consumed by the delivery it belongs to. The other has to be recovered, tracked, secured, and shown as a balance on every certificate until it reaches zero.</p>
<p>Booking them the same way is not a bookkeeping preference. It is how money goes out twice and comes back once. The related question of what to do when a stage payment is short of what was agreed is covered in <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a>.</p>]]></content:encoded></item>
<item><title>Set-off, and what it costs you to use it</title><link>https://be-teck.com/blog/set-off/</link><guid isPermaLink="true">https://be-teck.com/blog/set-off/</guid><pubDate>Tue, 01 Sep 2026 05:40:00 +0530</pubDate><description>Netting what you owe against what you are owed is quick and tempting. It also collapses two records into one and removes the evidence for both.</description><category>accounts</category><category>money</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Set-off is the practice of netting an amount you owe somebody against an amount they owe you, and paying only the difference.</p>
<p>A subcontractor has certified work worth a sum. They also damaged something, or were supplied material from your store, or were overpaid on a previous bill. So the certificate is reduced by that amount and the balance is paid.</p>
<p>It is quick, it is common, and it is often the right commercial answer. It also does something to your records that is worth understanding before it becomes routine.</p>
<h2 id="two-obligations-become-one-number">Two obligations become one number<a class="anchor" href="#two-obligations-become-one-number" aria-label="Link to this section">#</a></h2>
<p>Before set-off there are two facts: you owe them a certain amount for work done, and they owe you a certain amount for a specified reason.</p>
<p>After set-off there is one payment.</p>
<p>The two original facts still existed. But if the only entry in the system is the net payment, they are no longer recorded anywhere except in whatever note accompanied it. The certified value of the work is understated. The recovery is invisible. And the reason for the recovery — which is the only part anybody will want six months later — is nowhere at all.</p>
<p>Then somebody asks a perfectly ordinary question: <em>how much have we certified on this contract to date?</em> The answer from the ledger is wrong, low by the amount of every set-off ever applied — and on the other side it is an unexplained deduction, which is the commonest entry in <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a>.</p>
<h2 id="the-right-shape">The right shape<a class="anchor" href="#the-right-shape" aria-label="Link to this section">#</a></h2>
<p>Record both sides. Pay the net.</p>
<ul><li>Certify the work at its full measured value.</li><li>Raise the counter-claim as its own entry, dated, with its own reason and its own authorisation.</li><li>Show the payment as the certified value less that specific recovery, itemised.</li></ul>
<p>Three entries instead of one. It costs a minute and it preserves the two facts that actually happened.</p>
<p>On a <a href="https://be-teck.com/blog/running-account-bills/">running account bill</a> this matters even more than usual, because those bills are cumulative. A set-off buried in a net figure corrupts every subsequent cumulative comparison, and the corruption compounds silently across the project.</p>
<h2 id="what-makes-set-off-contentious">What makes set-off contentious<a class="anchor" href="#what-makes-set-off-contentious" aria-label="Link to this section">#</a></h2>
<p>The counter-claim is usually an assertion, not an agreed figure.</p>
<p>Damage to a wall is a fact. The cost of repairing it is a judgement. Material issued from your store is a fact; the rate at which it is charged back is a decision. When you set off, you are simultaneously deciding the amount and enforcing it, without the other party having agreed to either.</p>
<p>Legally the position varies with the contract and the circumstances, and it is not something to settle from an article. What is universally true is procedural: a set-off applied without notice, without a stated basis, and without a chance to respond is the single most reliable way to convert a commercial disagreement into a dispute, because it takes money out of somebody's hands before the argument has happened.</p>
<p>The practical rules that follow from that are unglamorous:</p>
<ol><li><strong>Notify before, not with, the payment.</strong> A deduction discovered on a remittance advice reads as a decision already taken.</li><li><strong>State the basis in a sentence somebody can dispute.</strong> "Recovery: material issued from store, 14 items, list attached" can be argued about. "Recovery" cannot, so the argument becomes about the whole relationship instead.</li><li><strong>Keep it separate from retention.</strong> Retention will come back. <a href="https://be-teck.com/blog/retention-money/">Retention money</a> is a balance held against a future event; a set-off is gone. Lumping them into one deduction line means neither can be reconciled.</li></ol>
<h2 id="the-reason-is-the-record">The reason is the record<a class="anchor" href="#the-reason-is-the-record" aria-label="Link to this section">#</a></h2>
<p>Once a set-off is applied, the reason for it becomes the only thing standing between you and a claim.</p>
<p>This is a specific case of something we keep running into in our own systems. When a payment is recorded for less than the agreed amount, our software now requires an explanation before it will accept the entry — the gap and its reason land on the record together, and the originally agreed figure stays reconstructible as paid plus deducted. That was built after we watched what happens when it is not there. The mechanics are in <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a>.</p>
<p>We also refused, deliberately, to let anybody delete a payment schedule that contained written-off stages, because deleting it would take with it every recorded reason for the write-off — and those reasons are the only surviving answer to who decided that money would never come.</p>
<p>A deduction with a reason is a commercial position. A deduction without one is an unexplained shortfall, and unexplained shortfalls are what the other side's lawyer builds a case from.</p>
<h2 id="set-off-across-contracts">Set-off across contracts<a class="anchor" href="#set-off-across-contracts" aria-label="Link to this section">#</a></h2>
<p>The tempting extension is to net across relationships: they owe us on project A, so reduce their payment on project B.</p>
<p>Whether this is permitted is a contract question and often a legal one, and the answer is frequently no. Separate contracts are separate obligations, and sometimes separate legal entities are involved even when the same people are.</p>
<p>Beyond the legal position, it has a practical cost that people underestimate. Once amounts move between contracts, no single contract's account is self-contained. The cumulative figures on both projects are now wrong in opposite directions, the final accounts cannot be prepared independently, and tracing anything requires a person who remembers.</p>
<p>If it must be done, do it as two explicit transfers with a stated reason, so each contract's own account still tells the truth about that contract.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Set-off is netting two obligations into one payment.</p>
<p>The payment is fine. The netting of the <em>records</em> is not, because it destroys both original facts and keeps neither reason.</p>
<p>Certify in full, raise the counter-claim as its own entry with its own basis, notify before you deduct, and never let a set-off share a line with retention.</p>]]></content:encoded></item>
<item><title>Why staged payments break accounting systems</title><link>https://be-teck.com/blog/staged-payments-and-accounting/</link><guid isPermaLink="true">https://be-teck.com/blog/staged-payments-and-accounting/</guid><pubDate>Tue, 01 Sep 2026 05:30:00 +0530</pubDate><description>Most systems store one paid date per bill. A payment in stages never writes it, so every screen asking "is this paid?" goes blind on exactly the biggest orders.</description><category>money</category><category>gaps</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Almost every purchase system in existence stores, somewhere, a field meaning <em>this has been paid</em>. Usually a date. Sometimes a flag.</p>
<p>It works perfectly for a bill that is paid in one movement, which is most bills. It fails completely for a bill paid in stages, which is most of the money. Staged payment is not an edge case in construction, because money arrives on one ladder and leaves on another — <a href="https://be-teck.com/blog/two-payment-ladders/">two payment ladders that never line up</a>.</p>
<h2 id="the-structural-problem">The structural problem<a class="anchor" href="#the-structural-problem" aria-label="Link to this section">#</a></h2>
<p>When a payment has a schedule, the stages <strong>are</strong> the payment record.</p>
<p>An advance in August, a balance in September. Two entries on a schedule, each with an amount, a date and a reference. Between them they describe the whole payment. There is nothing missing and no information has been lost.</p>
<p>What has not happened is the writing of a single top-level paid date, because there is no single date to write. The payment did not happen on a day. It happened across two.</p>
<p>So a system carrying both mechanisms — a paid date for simple payments and a schedule for staged ones — has two representations of the same fact. And every piece of code in it must know which representation to ask.</p>
<p>They do not. Not because anybody is careless, but because the paid date is right there, obvious, well named, and correct for most rows, and the schedule requires you to know it exists.</p>
<h2 id="what-it-looks-like-when-it-goes-wrong">What it looks like when it goes wrong<a class="anchor" href="#what-it-looks-like-when-it-goes-wrong" aria-label="Link to this section">#</a></h2>
<p>This happened to us, and the shape of it is worth setting out because it is almost certainly happening somewhere in your own tools.</p>
<p>An order was paid in full — an advance, then the balance some weeks later. Every rupee had gone. The people who paid it knew it was paid.</p>
<p>A queue inside the software kept asking for it to be paid again.</p>
<p>The cause was exactly the structure above. The instalment function never wrote the top-level paid date, so any query asking <em>is the paid date empty?</em> was blind to every rupee that had ever moved in instalments. One screen asking the wrong question is an ordinary defect. What we found was the same question asked all over the application, place after place, each in its own words, each written by somebody who reasonably assumed the field meant what it looked like it meant.</p>
<p>Four of them were queues and counters: the list cleared to pay, the list waiting for a signature, the number in the sidebar, and the sweep that puts a decision back in front of somebody who has already made it. Five more were found afterwards.</p>
<p>The full account, including the automated test that was holding the bug in place, is in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<h2 id="the-three-downstream-failures">The three downstream failures<a class="anchor" href="#the-three-downstream-failures" aria-label="Link to this section">#</a></h2>
<p>The queue was the visible symptom. The expensive parts were downstream.</p>
<p><strong>A chaser that had lost its credibility.</strong> A material line on an order paid in stages sat at "waiting on payment" for ever, and that stage has a reminder attached which rings the finance team every few days. So Finance was being reminded, repeatedly, about money that had already left the account.</p>
<p>Nobody reported it. That is the part worth sitting with. A recurring reminder which is occasionally wrong teaches you to skim the whole class of reminder, and once you skim it, the one that matters costs the same as the ones that do not.</p>
<p><strong>A lorry that arrived unannounced.</strong> The same stale question was being asked at the gate. The guard's list of expected loads refuses any line whose money has not settled, which is sensible. A load paid to the last rupee in stages carried no paid date, never reached the list, and a fully-paid lorry turned up at the barrier with nobody expecting it. That is the exact event the screen exists to prevent.</p>
<p><strong>A matcher that never let go.</strong> Our bank-line matcher kept staged-payment tasks in its candidate pool for ever, at their full amount, because the stages never set the paid date. So a long-settled order stayed permanently available to be matched against some future incoming transaction. The fix was to treat a fully answered schedule as a settlement timed at its last stage.</p>
<p>Three completely different subsystems. One missing fact.</p>
<h2 id="the-fix-is-not-one-fix-per-screen">The fix is not one fix per screen<a class="anchor" href="#the-fix-is-not-one-fix-per-screen" aria-label="Link to this section">#</a></h2>
<p>Writing the correct condition into each of those places would produce a copy of a rule per screen, which is the same problem again with a longer fuse.</p>
<p>There is now one function that answers <em>has the money for this actually settled?</em>, living in the file that owns payment schedules, with a mirror of it in the database query language beside it so the two cannot drift apart. Every surface asks it. None of them holds a second opinion.</p>
<p>That is the general remedy for this class, and it applies far beyond payments: any fact your work depends on that is computed in more than one place will eventually disagree with itself, and it will not disagree loudly. The same argument, applied to balances rather than to flags, is in <a href="https://be-teck.com/blog/retention-money/">retention money is a balance, not a memory</a>.</p>
<h2 id="what-to-check-in-your-own-system">What to check in your own system<a class="anchor" href="#what-to-check-in-your-own-system" aria-label="Link to this section">#</a></h2>
<p>Take one order that was paid in two parts, and ask each of these questions of your software:</p>
<ol><li>Does it appear as outstanding anywhere?</li><li>Does any reminder still fire for it?</li><li>If you export a list of unpaid bills, is it on it?</li><li>Does the ageing report include it?</li><li>If somebody searched for it today, would the answer be the same on every screen it appears on?</li></ol>
<p>If the answers differ, you have the same structure, and the number of places it has leaked into will be larger than you expect. Ours was nine.</p>
<h2 id="the-design-lesson">The design lesson<a class="anchor" href="#the-design-lesson" aria-label="Link to this section">#</a></h2>
<p>Do not represent one fact two ways.</p>
<p>If staged payment is possible at all, then the schedule is the payment record and the top-level date is a derived convenience at best — and a derived convenience should be computed, not stored, because a stored one goes stale in silence.</p>
<p>And if you must have both, then no code anywhere should read the raw field. It should ask a single function, and that function should be the only thing in the system that knows both representations exist. Everything else asks it.</p>
<p>A fact worth trusting has one owner.</p>]]></content:encoded></item>
<item><title>Reconciling a vendor bill against what actually arrived</title><link>https://be-teck.com/blog/reconciling-a-vendor-bill/</link><guid isPermaLink="true">https://be-teck.com/blog/reconciling-a-vendor-bill/</guid><pubDate>Tue, 01 Sep 2026 05:20:00 +0530</pubDate><description>A vendor's invoice is a claim, not a fact. Checking it is a five-step comparison, and four of the five steps fail for reasons that are not the vendor's fault.</description><category>accounts</category><category>procurement</category><category>stores</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>An invoice arrives. Somebody has to decide whether to pay it.</p>
<p>That decision looks like a single act and is really five comparisons, done in order, each of which can send the invoice back. Most organisations do two of them properly, skip one, and do the remaining two by feel.</p>
<h2 id="the-five-comparisons">The five comparisons<a class="anchor" href="#the-five-comparisons" aria-label="Link to this section">#</a></h2>
<p><strong>1. Is this invoice ours at all?</strong> Correct legal entity, correct site, correct project. Multi-entity groups get this wrong constantly, and an invoice paid by the wrong entity is a tax problem as well as an accounting one.</p>
<p><strong>2. Is it a duplicate?</strong> Same vendor, same invoice number, same amount. Also: same amount and same date with a different number, which is the version that gets through. Duplicate payment is one of the largest recoverable losses in any purchase ledger and it is caught by a check that takes a second.</p>
<p><strong>3. Does it match the order?</strong> Rate, unit, terms, tax treatment. Compare the invoice against the purchase order, because the rate was agreed in advance and the delivery has no opinion about it.</p>
<p><strong>4. Does it match the receipt?</strong> Quantity, against what your side recorded as arriving — not against what the order said, and not against the vendor's challan. This is the comparison that requires an independently written <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt note</a>, and it is the one most often skipped.</p>
<p><strong>5. Does the arithmetic work?</strong> Quantity times rate, plus tax, equals total. Invoices are typed by people.</p>
<p>Steps three and four together are <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a>. Steps one, two and five are the ones nobody writes a procedure for and everybody assumes somebody else did.</p>
<h2 id="why-the-receipt-comparison-fails">Why the receipt comparison fails<a class="anchor" href="#why-the-receipt-comparison-fails" aria-label="Link to this section">#</a></h2>
<p>Not because people are lazy. Because of four ordinary situations that a simple one-to-one comparison cannot represent.</p>
<p><strong>One order, several deliveries.</strong> Five lorries, five receipts, one monthly invoice. The comparison is many-to-one and a naive check either refuses it or compares against the first receipt and reports a shortfall that is not real.</p>
<p><strong>One delivery, several orders.</strong> A vendor consolidates. The reverse.</p>
<p><strong>Deliveries that straddle the period.</strong> Material received on the last day of the month, invoiced in the next. Nothing is wrong; the two documents simply live in different periods and any comparison restricted to a period misses them both.</p>
<p><strong>Receipts recorded from the challan.</strong> If the receipt was written by copying the vendor's own document — which is fast, and common — then the comparison is between the vendor's number and the vendor's number. It always passes. It proves nothing.</p>
<p>The fourth is the serious one, because it is invisible. The other three cause visible friction and get fixed. This one produces a clean report.</p>
<h2 id="the-mismatch-that-is-not-a-mismatch">The mismatch that is not a mismatch<a class="anchor" href="#the-mismatch-that-is-not-a-mismatch" aria-label="Link to this section">#</a></h2>
<p>A large proportion of investigated mismatches turn out to be unit differences rather than quantity differences. Ordered per tonne, invoiced per quintal; received in bags, invoiced in kilograms.</p>
<p>The comparison must include the unit or it will confidently report a quantity discrepancy and send everybody looking in the wrong place. It has its own piece: <a href="https://be-teck.com/blog/the-unit-of-measure/">the unit of measure</a>.</p>
<h2 id="tax-lines-are-part-of-the-reconciliation">Tax lines are part of the reconciliation<a class="anchor" href="#tax-lines-are-part-of-the-reconciliation" aria-label="Link to this section">#</a></h2>
<p>The tax on an invoice is not decoration and should be checked against the order rather than accepted.</p>
<p>Two things to look at. Whether the tax treatment matches what was agreed — the place of supply, the rate category, whether the vendor is charging tax at all. And whether the invoice contains the details your own credit claim depends on: the vendor's registration, a valid invoice number, the correct particulars.</p>
<p>The reason this belongs in the reconciliation rather than later is that an invoice with defective particulars is easy to have corrected while the money is still unpaid and nearly impossible afterwards. The mechanism, and why the vendor's own filing behaviour becomes your problem, is in <a href="https://be-teck.com/blog/input-tax-credit/">input tax credit</a>.</p>
<h2 id="what-to-do-with-a-genuine-mismatch">What to do with a genuine mismatch<a class="anchor" href="#what-to-do-with-a-genuine-mismatch" aria-label="Link to this section">#</a></h2>
<p>Not hold the whole invoice indefinitely. That is the default behaviour and it is bad for everybody: the vendor is unpaid on the correct lines as well as the disputed one, the relationship deteriorates, and the disputed line gets settled under commercial pressure rather than on the facts.</p>
<p>Better: pay what is agreed, hold what is not, and say in one sentence what is held and why. A vendor who knows exactly which line is in question and why can resolve it. A vendor whose invoice is simply unpaid can only chase, which is the same five comparisons seen from the other end — <a href="https://be-teck.com/blog/getting-paid-on-time/">getting paid on time, from the contractor's side</a>.</p>
<p>And record the held amount as its own entry with its own reason, rather than paying a net figure and letting the difference vanish. That distinction — between netting the payment and netting the record — is covered in <a href="https://be-teck.com/blog/set-off/">set-off</a>.</p>
<h2 id="automate-the-comparison-not-the-decision">Automate the comparison, not the decision<a class="anchor" href="#automate-the-comparison-not-the-decision" aria-label="Link to this section">#</a></h2>
<p>The checking is arithmetic and belongs to a machine. There is no reason for a person to compare five hundred invoice lines against five hundred receipt lines.</p>
<p>The decision is different. Whether to pay an invoice with a small discrepancy, whether to accept an explanation, whether this vendor's pattern is worth a conversation — these need somebody who knows the relationship.</p>
<p>We hold to that separation firmly in our own systems: the machine proposes, a person decides. When our software matches a delivery document to a purchase, the match is recorded as a <strong>suggestion</strong> and only a person's tap makes it a link. When it suggests a bank transaction belongs to a particular order, that is an ask, not an attachment. The reasoning is in <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<p>It is not caution for its own sake. A machine that attaches money to the wrong order does not merely make an error — it makes an error that looks like a record, and the next person to read it has no way of knowing a human never agreed.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>An invoice is a claim. Five comparisons decide whether to honour it, and the one that matters most needs a receipt your own side wrote.</p>
<p>Check the entity, check for duplicates, match the rate to the order and the quantity to the receipt, and redo the arithmetic.</p>
<p>Then pay what is agreed, hold what is not, and say which is which.</p>]]></content:encoded></item>
<item><title>TDS on construction payments, explained as a mechanism</title><link>https://be-teck.com/blog/tds-on-construction-payments/</link><guid isPermaLink="true">https://be-teck.com/blog/tds-on-construction-payments/</guid><pubDate>Tue, 01 Sep 2026 05:10:00 +0530</pubDate><description>Tax deducted at source moves a slice of a payment from the payer to the government on the payee's behalf. Understanding the mechanism prevents most of the errors.</description><category>accounts</category><category>money</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Tax deducted at source is a collection mechanism. When one party makes certain kinds of payment to another, the payer withholds a portion and remits it to the government against the recipient's tax account, then pays over the balance.</p>
<p>The recipient has not lost that money. It sits to their credit and is set against their own tax liability when they file. What has changed is the timing and the identity of who hands it over.</p>
<p>This piece is about the mechanism and the errors it generates, not about rates, thresholds or section numbers. Those change, they depend on facts about the payee that only your accountant should be deciding, and getting them from an article is how people end up with demands. <strong>Take the numbers from your accountant. Take the shape from here.</strong></p>
<h2 id="why-the-mechanism-exists">Why the mechanism exists<a class="anchor" href="#why-the-mechanism-exists" aria-label="Link to this section">#</a></h2>
<p>Collecting tax from a large number of small recipients is difficult. Collecting it from a smaller number of payers who are already keeping books is easier.</p>
<p>So the obligation is placed on the payer. And because the obligation is on the payer, the consequences of getting it wrong land on the payer too — which is the part that surprises people. If you fail to deduct when you should have, the shortfall, and interest on it, is generally recoverable from you, not from the person you paid.</p>
<p>That single fact explains why finance departments are cautious about this to a degree that looks disproportionate from outside.</p>
<h2 id="the-four-decisions-in-every-deduction">The four decisions in every deduction<a class="anchor" href="#the-four-decisions-in-every-deduction" aria-label="Link to this section">#</a></h2>
<p>Each payment requires four questions to be answered, in order, and each has its own failure mode.</p>
<p><strong>Is this payment of a type that attracts deduction?</strong> Different categories — contract work, professional services, rent, commission, purchase of goods — have different treatments. Construction organisations pay all of these, often to the same vendor, sometimes on the same invoice.</p>
<p><strong>Who is the payee, in tax terms?</strong> The treatment can depend on the legal status of the recipient and on whether they have furnished a valid tax identification. A missing or invalid identifier typically attracts a materially harsher treatment, which is why collecting and verifying it before the first payment matters far more than it seems to at the time.</p>
<p><strong>On what amount?</strong> Generally the value of the service, and whether tax charged on the invoice forms part of the base depends on how the invoice is drawn and on the category. An invoice that does not separate the components makes this question harder than it needs to be.</p>
<p><strong>When?</strong> Deduction obligations are usually triggered at the earlier of credit in the books or payment. This catches people who assume nothing happens until money moves. A provision made at year end can trigger the obligation without anybody writing a cheque.</p>
<h2 id="where-construction-makes-it-harder">Where construction makes it harder<a class="anchor" href="#where-construction-makes-it-harder" aria-label="Link to this section">#</a></h2>
<p><strong>Mixed invoices.</strong> A single bill for material supplied and labour to install it may attract different treatment on different components. If the invoice shows one figure, somebody has to apportion, and an apportionment done by guesswork is a decision made by the least qualified person in the chain.</p>
<p><strong>Running account bills.</strong> These are cumulative — each restates the job to date and subtracts what was already certified. Deduction is on this bill's payment, not on the cumulative figure, and a system that applies a percentage to the wrong one over-deducts spectacularly. The cumulative structure is set out in <a href="https://be-teck.com/blog/running-account-bills/">running account bills</a>.</p>
<p><strong>Advances.</strong> Money paid before work is done can still trigger an obligation depending on the category and the terms. A <a href="https://be-teck.com/blog/mobilisation-advance/">mobilisation advance</a>, being a loan rather than a payment for services, may be treated differently from an advance against an order — one more reason to book the two distinctly.</p>
<p><strong>Retention.</strong> Money withheld and released later raises a timing question that is easy to get wrong in both directions: deducting twice, or never deducting at all because the release looks like a balance movement rather than a payment.</p>
<p><strong>Set-off.</strong> When a payment is netted against a counter-claim, the deduction base is the gross amount, not the net you actually pay. Systems that compute deduction from the payment figure get this wrong every time. It is another reason to record gross and recovery separately rather than paying a net number, which is the argument made in <a href="https://be-teck.com/blog/set-off/">set-off</a>.</p>
<h2 id="the-certificate-is-the-point">The certificate is the point<a class="anchor" href="#the-certificate-is-the-point" aria-label="Link to this section">#</a></h2>
<p>The recipient can only claim credit for what has actually been deposited and reported against their identifier. So three things have to happen, not one: deduct, deposit on time, and report correctly in the periodic return.</p>
<p>A deduction that is made but not reported is worse than no deduction at all from the payee's point of view: their money has gone and they cannot claim it. This is a very common cause of vendor disputes, and it is invariably discovered months later when the vendor's own filing does not reconcile.</p>
<p>Two practical consequences:</p>
<ul><li><strong>The vendor's tax identifier is a critical data field.</strong> It should be validated when the vendor is created, not when the first payment is made, and a change to it should be treated as significant rather than as an ordinary edit.</li><li><strong>The mapping from payment to identifier must be exact.</strong> Paying one legal entity and reporting against another's identifier produces a credit that lands in the wrong account, and unwinding it is slow.</li></ul>
<h2 id="what-a-system-should-and-should-not-do">What a system should and should not do<a class="anchor" href="#what-a-system-should-and-should-not-do" aria-label="Link to this section">#</a></h2>
<p>It should compute the deduction, using rates held as configuration rather than in code, per category and per payee status. It should show gross, deduction and net separately on every payment record. It should make the deduction reconstructible: which rule was applied, on what base, on what date.</p>
<p>It should not decide the category. That is a judgement about the nature of the work, and a machine which quietly categorises payments is making tax decisions in the dark. The right shape is the one we use for everything of this kind — the system proposes a treatment with its reasoning visible and a person confirms. The argument for that is in <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Deduction moves a slice of a payment to the government on the payee's behalf, and the obligation — and the liability for getting it wrong — sits with the payer.</p>
<p>Four questions per payment: what type, who is the payee, on what base, and when. Construction complicates all four because of mixed invoices, cumulative bills, advances, retention and set-off.</p>
<p>And the deduction is only half the job. Depositing and reporting it correctly is what turns a withholding into a credit the vendor can actually use.</p>]]></content:encoded></item>
<item><title>Input tax credit, and why your vendor's filing is your problem</title><link>https://be-teck.com/blog/input-tax-credit/</link><guid isPermaLink="true">https://be-teck.com/blog/input-tax-credit/</guid><pubDate>Tue, 01 Sep 2026 05:00:00 +0530</pubDate><description>GST credit lets you offset tax paid on purchases against tax you collect. The conditions attached to it are what make vendor discipline a finance function.</description><category>accounts</category><category>money</category><category>procurement</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Under GST, tax is charged at each stage of a supply chain, and a registered business can generally offset the tax it paid on its purchases against the tax it collects on its sales. The offset is input tax credit.</p>
<p>The intent is that tax falls on value added rather than accumulating at every handover. The mechanism is straightforward. The conditions attached to it are where construction organisations lose money, and they lose it for reasons that have very little to do with tax and everything to do with record keeping.</p>
<p>As with anything of this kind: <strong>the rates, the categories and the boundaries are your accountant's territory.</strong> What follows is the shape of the mechanism and the operational habits it demands.</p>
<h2 id="the-conditions-in-outline">The conditions, in outline<a class="anchor" href="#the-conditions-in-outline" aria-label="Link to this section">#</a></h2>
<p>Credit is not automatic on having paid tax. Broadly, a set of conditions has to be satisfied: you must hold a valid tax invoice or equivalent document, the goods or services must actually have been received, the tax must have been paid to the government by the supplier, and you must have accounted for it in your own return within the applicable time limits.</p>
<p>Two of those four are outside your control, and one is entirely in somebody else's hands.</p>
<h2 id="the-condition-that-makes-it-operational">The condition that makes it operational<a class="anchor" href="#the-condition-that-makes-it-operational" aria-label="Link to this section">#</a></h2>
<p><strong>The supplier must have declared and paid.</strong></p>
<p>This is the one that changes how a purchase department has to behave. Your credit depends on a third party filing their return correctly, on time, with your registration correctly stated on the right invoice.</p>
<p>If they do not, your credit is at risk regardless of the fact that you paid them the tax in good faith. The recovery route is commercial — you chase the supplier — and the commercial leverage you have is whatever money of theirs you are still holding.</p>
<p>Which produces the single most useful operational rule in this area: <strong>the tax component of an invoice is not the same kind of money as the rest of it, and it is worth knowing whether the supplier has filed before the last payment goes out.</strong> Once you have paid in full, the leverage is gone and you are relying on goodwill.</p>
<h2 id="reconciliation-is-a-monthly-discipline-not-an-annual-one">Reconciliation is a monthly discipline, not an annual one<a class="anchor" href="#reconciliation-is-a-monthly-discipline-not-an-annual-one" aria-label="Link to this section">#</a></h2>
<p>Your books say you have a certain amount of credit. The tax system says your suppliers have declared a certain amount against your registration. These two figures will differ.</p>
<p>Every difference falls into one of a small number of categories:</p>
<ul><li><strong>Timing.</strong> They filed in a later period than you booked. Resolves itself.</li><li><strong>Your error.</strong> Wrong registration captured, invoice booked twice, credit claimed on something ineligible.</li><li><strong>Their error.</strong> Your registration typed wrongly, invoice reported against another customer, invoice not reported at all.</li><li><strong>Their failure.</strong> They have not filed.</li></ul>
<p>Only the last two require chasing, and you cannot tell them apart from a total. This is exactly the argument for reconciling monthly rather than at year end: a small difference over one period is traceable to specific invoices, and a large one over a year is a project. Classifying every difference by cause is also what settles a plain balance confirmation — <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a>.</p>
<p>It is the same argument, structurally, as the one for <a href="https://be-teck.com/blog/stock-reconciliation/">counting stock small and often</a>. A residual computed over a long period absorbs every kind of error and identifies none of them.</p>
<h2 id="the-restriction-construction-has-to-know-about">The restriction construction has to know about<a class="anchor" href="#the-restriction-construction-has-to-know-about" aria-label="Link to this section">#</a></h2>
<p>There are categories of expenditure on which credit is blocked, and one of them matters enormously in this industry: credit relating to the construction of immovable property is restricted in defined circumstances.</p>
<p>The precise boundary — what counts as construction, what counts as plant and machinery, what happens when the property is built for sale rather than for own use, what happens with works contract services — is genuinely complicated, has been litigated, and is not something to determine from a blog post.</p>
<p>What every purchase and accounts person in construction should know is simply that <strong>the restriction exists and is expensive</strong>, and that assuming credit is available on everything is the single most costly wrong assumption in the area. Get the position for your own circumstances from your accountant, in writing, and then encode it in how purchases are categorised at entry rather than discovering it at filing time.</p>
<h2 id="what-this-demands-of-the-purchase-process">What this demands of the purchase process<a class="anchor" href="#what-this-demands-of-the-purchase-process" aria-label="Link to this section">#</a></h2>
<p>The tax conditions convert several things that look like clerical details into material controls.</p>
<p><strong>Vendor registration details, validated at creation.</strong> Not at first payment. An invoice from a vendor whose registration was never verified is a credit you may not be able to claim, and it is far easier to fix before any money has moved.</p>
<p><strong>Correct particulars on the invoice.</strong> Registration numbers, invoice number and date, place of supply, description, rate and amount of tax. An invoice with defective particulars can usually be replaced while it is unpaid. Afterwards it becomes a favour you are asking.</p>
<p><strong>The receipt of goods, recorded.</strong> One of the conditions is that the goods or services were actually received. A purchase ledger that cannot demonstrate receipt independently of the vendor's own paperwork is weaker on this than it looks, which is one more argument for <a href="https://be-teck.com/blog/what-a-goods-receipt-note-is/">goods receipt notes written by your own side</a>.</p>
<p><strong>Time limits observed.</strong> Credit has to be claimed within a period. An invoice that surfaces late — found in a drawer, or held back during a dispute — can become a credit you are no longer entitled to. A dispute that drags is therefore not cost-free even if you eventually win it.</p>
<h2 id="where-the-checking-belongs">Where the checking belongs<a class="anchor" href="#where-the-checking-belongs" aria-label="Link to this section">#</a></h2>
<p>The comparison between your ledger and what suppliers have reported is arithmetic across two datasets and belongs to a machine.</p>
<p>The decisions that come out of it do not. Whether to hold a payment because a supplier has not filed, whether a difference is worth pursuing, whether a relationship is worth the friction — those need somebody who knows the vendor.</p>
<p>The right arrangement is the one we hold to throughout our own systems: the machine produces a list of specific, evidenced differences and proposes what each one probably is; a person decides what to do about it. Not because machines are unreliable, but because a machine that acts on its own leaves behind a record that looks like a human decision and was not. The reasoning is in <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Input tax credit offsets tax paid on purchases against tax collected on sales, subject to conditions — and one of those conditions is that somebody else filed their return properly.</p>
<p>That makes vendor data quality, invoice particulars and monthly reconciliation into finance controls rather than clerical work.</p>
<p>And in construction there is a restriction on credit relating to immovable property that is large enough to change project economics. Find out where the line falls for your own circumstances before you assume which side of it you are on.</p>]]></content:encoded></item>
<item><title>Paying less than agreed is a statement, not a typo</title><link>https://be-teck.com/blog/paying-less-than-agreed/</link><guid isPermaLink="true">https://be-teck.com/blog/paying-less-than-agreed/</guid><pubDate>Tue, 01 Sep 2026 04:50:00 +0530</pubDate><description>A short payment carries a decision inside it. If the system accepts the smaller number silently, the decision is lost and only the discrepancy survives.</description><category>money</category><category>records</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>An order is agreed at one figure. The payment that goes out is smaller.</p>
<p>This happens all the time, for good reasons: short quantity, damaged material, a rate correction, a recovery, an agreed discount for late delivery. It is ordinary commercial life.</p>
<p>What is not ordinary is what most systems do with it, which is accept the smaller number and say nothing. The result is a record showing an agreed amount and a paid amount that do not match, with no explanation attached to either, and a permanent open balance that nobody can close because nobody can remember why it is there.</p>
<h2 id="the-two-readings-of-an-unexplained-gap">The two readings of an unexplained gap<a class="anchor" href="#the-two-readings-of-an-unexplained-gap" aria-label="Link to this section">#</a></h2>
<p>Six weeks later somebody looks at that order. The agreed figure is one number, the paid figure is smaller. There are exactly two possible readings and no way to distinguish them:</p>
<ul><li><strong>We still owe the difference.</strong> Somebody must chase it, and the vendor is right to be waiting.</li><li><strong>We settled for less, deliberately.</strong> The difference is not owed, the order is complete, and chasing it will be embarrassing.</li></ul>
<p>Both readings are consistent with the record. Whichever one the reader assumes becomes the truth, and different readers assume differently.</p>
<p>That is the actual cost of a silent short payment. Not the money — the money was correct. The cost is a record that cannot answer a question about itself. It is also the commonest reason a vendor's ledger and yours will not agree — <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a>.</p>
<h2 id="ask-at-the-moment-because-it-is-the-only-moment">Ask at the moment, because it is the only moment<a class="anchor" href="#ask-at-the-moment-because-it-is-the-only-moment" aria-label="Link to this section">#</a></h2>
<p>The information exists exactly once: when the person entering the payment knows why it is short. Ten minutes later it is in their head, next week it is gone, next month they have left.</p>
<p>So the intervention has to happen at entry. In our own system, recording a stage payment below the agreed figure now asks <strong>why less</strong> before it accepts. It is one field and it is required.</p>
<p>Three things then happen with the answer.</p>
<p><strong>The gap and its reason land on the stage row itself</strong> — an amount deducted and a short phrase saying what for. Not in a comment, not in an attachment: on the row, where anybody reading the payment reads the reason at the same time.</p>
<p><strong>The order total revises to what was actually paid.</strong> Said out loud in a comment on the task and written to the audit trail, under the name of the person who did it.</p>
<p><strong>The originally agreed figure stays reconstructible.</strong> Paid plus deducted equals what was agreed. Nothing is destroyed — the revision is a derived view, not an overwrite, which matters for the reasons set out in <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>.</p>
<h2 id="why-the-total-should-self-correct">Why the total should self-correct<a class="anchor" href="#why-the-total-should-self-correct" aria-label="Link to this section">#</a></h2>
<p>This was the part that took an argument.</p>
<p>The instinct is to leave the agreed total alone, on the grounds that it is what was agreed. The problem is that everything downstream then reports a permanent shortfall on an order that is in fact complete: the outstanding balance is overstated, the ageing report shows an old open item, and any queue built on "agreed minus paid" carries it for ever.</p>
<p>So the rule we settled on is that the moment a payment schedule's last stage is paid or written off, the order total corrects to what the stages actually recorded — with an audit entry always, and a comment naming the person. And a sweep does the same for every order settled before the rule existed, converging to zero writes once history has caught up.</p>
<p>There is one deliberate exception. A correction of this kind does <strong>not</strong> void management signatures on the order. The rule that protects signatures exists for money still to move; this is money that already moved, and it moved downward of what was signed for. Voiding an approval because less was spent would be a machine punishing the right outcome.</p>
<h2 id="short-payment-is-not-the-same-as-a-deduction-or-a-write-off">Short payment is not the same as a deduction, or a write-off<a class="anchor" href="#short-payment-is-not-the-same-as-a-deduction-or-a-write-off" aria-label="Link to this section">#</a></h2>
<p>Three things look similar on a bank statement and are completely different in the ledger.</p>
<p><strong>A short payment</strong> is the whole payment for that stage, at a revised amount, by agreement. The balance is not owed.</p>
<p><strong>A set-off</strong> is a full payment reduced by a separate obligation running the other way. The full amount is still owed on this contract, and a counter-claim exists on its own account. Netting the two into one number destroys both facts — that is the subject of <a href="https://be-teck.com/blog/set-off/">set-off</a>.</p>
<p><strong>A write-off</strong> is a decision that money owed will never arrive. It is not a payment at all. It has its own piece: <a href="https://be-teck.com/blog/writing-off-money/">writing off money that is never coming</a>.</p>
<p>If your system offers one field for all three, it will be used for all three, and the ledger will lose the distinction permanently.</p>
<h2 id="the-reason-has-to-be-defensible-not-free-text">The reason has to be defensible, not free text<a class="anchor" href="#the-reason-has-to-be-defensible-not-free-text" aria-label="Link to this section">#</a></h2>
<p>A reason field accepting anything will receive "adjustment", "as discussed" and a single full stop.</p>
<p>Two things help. A short list of the reasons that actually occur — short quantity, quality deduction, rate correction, agreed discount, recovery — so the common case is a tap rather than typing. And a free field beside it for the specifics, because the list will never cover everything and forcing a category onto an unusual case produces a wrong category rather than a blank one.</p>
<p>The categories are what make the pattern visible later: one vendor consistently short-delivering, one material consistently disputed. A pile of free text cannot be counted, and a pattern you cannot count is a pattern nobody will find.</p>
<h2 id="the-general-shape">The general shape<a class="anchor" href="#the-general-shape" aria-label="Link to this section">#</a></h2>
<p>Any time your system accepts a number different from the number it expected, it is watching a decision being made and choosing not to record it.</p>
<p>That is the moment to ask. Not with a warning that can be dismissed, and not with a block — the payment is legitimate and blocking it teaches people to route around the system. Ask for the one piece of information that only exists right now, put it on the record beside the number it explains, and let the arithmetic reconcile itself.</p>
<p>A difference with a reason is information. A difference absorbed in silence is a question your records will be asked and cannot answer.</p>]]></content:encoded></item>
<item><title>Work order or purchase order: which one you are issuing</title><link>https://be-teck.com/blog/work-order-or-purchase-order/</link><guid isPermaLink="true">https://be-teck.com/blog/work-order-or-purchase-order/</guid><pubDate>Tue, 01 Sep 2026 04:40:00 +0530</pubDate><description>One buys a thing, the other buys an outcome. The paperwork looks similar and the risk, measurement and payment mechanics are completely different.</description><category>procurement</category><category>money</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A purchase order buys goods. A work order buys work.</p>
<p>Stated like that it sounds too obvious to write down, and yet the two documents are routinely used interchangeably, produced from the same template, and approved by the same person on the same screen. They carry different risk, need different measurement, and pay out on different events.</p>
<h2 id="what-changes-when-you-buy-work-rather-than-goods">What changes when you buy work rather than goods<a class="anchor" href="#what-changes-when-you-buy-work-rather-than-goods" aria-label="Link to this section">#</a></h2>
<p><strong>Completion is a judgement.</strong> A purchase order is satisfied by delivery, which is an observable event with a lorry attached. A work order is satisfied by work being done to a standard, and somebody has to decide whether it has been.</p>
<p><strong>Quantity is measured after the fact.</strong> With goods, the quantity is what was ordered and what arrived. With work, the quantity is what was executed, and it is determined by measurement on site against the rates in the order — which is why work is paid on <a href="https://be-teck.com/blog/running-account-bills/">running account bills</a> and goods are usually paid on invoice.</p>
<p><strong>Defects appear later.</strong> Faulty material shows up on arrival or shortly after. Faulty work shows up in the monsoon. Hence defect liability periods and retention, neither of which has an equivalent in a straightforward purchase.</p>
<p><strong>People are on your site.</strong> Which brings safety obligations, access control, insurance, and a set of statutory responsibilities that buying a lorry of sand does not.</p>
<p><strong>The tax treatment differs</strong>, in ways that depend on the nature of the supply. This is your accountant's question, not a template's, but it is one more reason the two documents should not be produced by the same form with a different title.</p>
<h2 id="the-hybrid-which-is-most-of-them">The hybrid, which is most of them<a class="anchor" href="#the-hybrid-which-is-most-of-them" aria-label="Link to this section">#</a></h2>
<p>Very few orders in construction are pure. "Supply and fix", "provide and lay", "supply, install and commission" — these are a supply and a service in one line, and the split between them is not stated anywhere.</p>
<p>That unstated split is where several separate problems originate:</p>
<ul><li><strong>Measurement.</strong> Is the item paid on delivery of material, on completion of installation, or partly on each?</li><li><strong>Risk of loss.</strong> Who owns the material sitting on site before it is fixed?</li><li><strong>Retention.</strong> Does it apply to the whole value or only the labour portion?</li><li><strong>Tax.</strong> The treatment may differ across the components.</li><li><strong>Defect liability.</strong> Material defects and workmanship defects may be different parties' problem.</li></ul>
<p>None of these has a universal answer. All of them have an answer for your contract, and that answer should be written on the order rather than established by argument at the first dispute.</p>
<h2 id="the-line-item-is-the-contract">The line item is the contract<a class="anchor" href="#the-line-item-is-the-contract" aria-label="Link to this section">#</a></h2>
<p>Whichever document it is, its power sits in the description of each line, and descriptions are written badly with remarkable consistency.</p>
<p>A good line names: what is included, what is excluded, the unit, the rate, and what event makes it payable. That last one is the field almost nobody has, and it is the one that determines when money moves. The other clauses worth reading before anybody signs are set out in <a href="https://be-teck.com/blog/what-a-work-order-should-say/">what a work order should say</a>.</p>
<p>The habit of reading a description for what it excludes rather than what it includes is the same discipline that makes somebody good at <a href="https://be-teck.com/blog/reading-a-bill-of-quantities/">reading a bill of quantities</a>, and it is worth training deliberately.</p>
<h2 id="approval-is-about-consequence-not-amount">Approval is about consequence, not amount<a class="anchor" href="#approval-is-about-consequence-not-amount" aria-label="Link to this section">#</a></h2>
<p>Most organisations route approval by value: below a figure one person signs, above it two.</p>
<p>Value is a poor proxy on its own. A small work order that puts people on a live site, or that touches a structural element, or that commits you to a defect liability for years, carries more consequence than a large order for a commodity material at a rate already agreed.</p>
<p>A better shape is to route on the properties that actually create exposure: whether it is work or supply, whether it involves people on site, whether it creates an ongoing liability, whether the rate is pre-agreed or new. Value remains one input among several.</p>
<p>What should never vary is the floor. Money leaving the company needs two different people, regardless of amount, for reasons set out in <a href="https://be-teck.com/blog/two-signatures-on-money/">why one person should never move the company's money</a>.</p>
<h2 id="amendments-and-the-version-that-was-actually-acted-on">Amendments, and the version that was actually acted on<a class="anchor" href="#amendments-and-the-version-that-was-actually-acted-on" aria-label="Link to this section">#</a></h2>
<p>Orders change. Scope is added, rates are revised, quantities move.</p>
<p>The failure is not amendment. It is amendment by conversation. A revised rate agreed on a phone call, confirmed by a message, and never reflected in the order produces a document that no longer describes the agreement, and every downstream check against it fails correctly and inexplicably.</p>
<p>Two requirements. An amendment is a <strong>new version with a number and a date</strong>, not an edit to the original — because the original may already have been acted on and somebody may need to know what it said at the time. And the version that was current when each delivery or measurement happened must be identifiable afterwards.</p>
<p>This is the same principle that makes a signed document worth signing. The value of a record is that it says what it said; a record which can be revised in place is worth exactly as much as the memory of the last person to open it. We have written about the mechanics of that in <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident documents</a>.</p>
<h2 id="the-document-that-gets-acted-on-is-the-one-on-the-site">The document that gets acted on is the one on the site<a class="anchor" href="#the-document-that-gets-acted-on-is-the-one-on-the-site" aria-label="Link to this section">#</a></h2>
<p>A last practical point that no template solves.</p>
<p>The version of the order that governs behaviour is whichever version the person doing the work is holding. If that is a printout from three weeks ago, then three weeks ago is your contract, whatever the file server says.</p>
<p>The only real remedy is that the current version has to be easier to reach than the old one. Not a policy about superseded copies. A link that is genuinely faster to open than a piece of paper is to find, on a phone, on site, on a bad connection.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A purchase order buys a thing and is satisfied by delivery. A work order buys an outcome and is satisfied by judgement, measurement, and eventually by the absence of defects.</p>
<p>Most real orders are both, and the split between the two halves should be written down rather than assumed.</p>
<p>Route approval on consequence rather than on amount alone, amend by versioning rather than by editing, and make the current version the easiest one to find.</p>]]></content:encoded></item>
<item><title>Why one person should never move the company's money</title><link>https://be-teck.com/blog/two-signatures-on-money/</link><guid isPermaLink="true">https://be-teck.com/blog/two-signatures-on-money/</guid><pubDate>Tue, 01 Sep 2026 04:30:00 +0530</pubDate><description>Two different people on every payment is not distrust. It is the cheapest control there is, and every convenience that erodes it erodes the whole thing.</description><category>money</category><category>principles</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>One person should not be able to move the company's money alone.</p>
<p>It is an old rule, it is not clever, and almost every organisation that has one has spent years slowly weakening it — not by decision, but by a series of individually reasonable conveniences.</p>
<h2 id="what-the-rule-is-actually-protecting-against">What the rule is actually protecting against<a class="anchor" href="#what-the-rule-is-actually-protecting-against" aria-label="Link to this section">#</a></h2>
<p>Not primarily theft. Theft is the case everybody cites and the least common one.</p>
<p>The rule protects against three things, and the first two are much more likely than the third.</p>
<p><strong>Error.</strong> Wrong vendor selected from a list, wrong amount typed, wrong invoice attached, payment made twice. A second person looking at the same payment catches a meaningful proportion of these, because they are reading it fresh rather than checking their own work.</p>
<p><strong>Pressure.</strong> A person being leaned on — by a vendor, by a senior colleague, by circumstances — is much harder to lean on when the payment requires somebody else too. The rule does not just detect wrongdoing; it gives an honest person a reason they can say out loud.</p>
<p><strong>Deliberate misuse.</strong> Rarer, and the reason the rule is written down.</p>
<p>The first two are why the rule earns its keep on a normal day, and it is worth saying so, because a control justified only by suspicion is a control people resent.</p>
<h2 id="the-conveniences-that-dissolve-it">The conveniences that dissolve it<a class="anchor" href="#the-conveniences-that-dissolve-it" aria-label="Link to this section">#</a></h2>
<p>None of these is proposed in bad faith. Each is proposed by somebody trying to make a real problem go away.</p>
<p><strong>Amount bands.</strong> "Payments below a certain figure only need one signature." This is the most common and the most damaging, because it does not weaken the rule — it repeals it. There is now a size of payment one person can make alone, and a person intending misuse will simply make several. When this was proposed in our own system, we built everything else in that release and left this half out, on the grounds that a floor with a hole in it is not a floor.</p>
<p><strong>Standing approvals.</strong> "This vendor is approved, so payments to them do not need a second look." The second signature is not about the vendor's legitimacy. It is about this payment.</p>
<p><strong>Emergency overrides.</strong> Necessary, and the correct design is not to remove them but to make them loud: a named person, a stated reason, recorded distinctly, and visible afterwards without anybody having to go looking. An override that is quiet becomes an ordinary route within a month.</p>
<p><strong>Delegation done carelessly.</strong> Somebody is travelling and hands their authority to a colleague — who already holds the other signature. Two slots, one human, and the rule is gone while the screen still shows two names.</p>
<p>Each of the four is a question worth putting to a vendor before you buy — <a href="https://be-teck.com/blog/approval-chains-worth-asking-about/">approval chains worth asking about</a>.</p>
<h2 id="delegation-without-collapsing-the-floor">Delegation without collapsing the floor<a class="anchor" href="#delegation-without-collapsing-the-floor" aria-label="Link to this section">#</a></h2>
<p>Delegation is genuinely necessary. People travel, take leave, fall ill, and a payment system that stops when one person is unavailable will be routed around.</p>
<p>The version that works has four properties:</p>
<ul><li><strong>Bounded in time.</strong> A window with an end date, not an open-ended transfer.</li><li><strong>Revocable by either party</strong>, immediately.</li><li><strong>Never to somebody who already holds the other slot.</strong> One human must not end up holding two signatures, and this has to be enforced by the system rather than by the good sense of whoever sets it up.</li><li><strong>Visible on the record.</strong> The audit says <em>on behalf of</em>, and the person being stood in for is told when it is arranged.</li></ul>
<p>The emergency override, if you have one, stays with the original holder. A stand-in gets the ordinary authority, not the exceptional one.</p>
<p>That is how we built it, and the constraint that shaped every part of it was the same sentence: two different humans sign every payment, and the floor never moves.</p>
<h2 id="the-second-signature-has-to-be-a-real-reading">The second signature has to be a real reading<a class="anchor" href="#the-second-signature-has-to-be-a-real-reading" aria-label="Link to this section">#</a></h2>
<p>A control that everybody performs and nobody exercises is worse than no control, because it produces a record of scrutiny that did not happen.</p>
<p>The second signature stops being real when the queue is full of items that require no thought. Approve forty routine payments and the forty-first gets the same reflex. This is not a character flaw; it is what attention does.</p>
<p>So the design job is to keep the queue about decisions. Three things help:</p>
<p><strong>Only ask about money that has not yet moved.</strong> A queue that includes payments already made is asking for a decision that cannot be made — the money is gone — and it teaches people the queue is decorative. We had exactly this fault: a fix in one place caused every already-paid item to appear in the approvals queue asking to be signed, some of them weeks old. Money that moved without a sign-off has not been forgotten, but it belongs in its own place, where the question is <em>who authorised this</em> rather than <em>shall we</em>.</p>
<p><strong>Put the facts that decide it on the row.</strong> Whether material has arrived against this payment, whether it is an advance, what the order was for. Our approvals queue says either that delivery documents have been filed or, in amber, that none have — <em>money before material?</em> A question, not a block, since some payments rightly precede material.</p>
<p><strong>Say what is unusual.</strong> A signer's attention should be spent on the exceptional row, which means the system has to know which row is exceptional and say so. The general form of that argument is in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<h2 id="the-record-is-half-the-control">The record is half the control<a class="anchor" href="#the-record-is-half-the-control" aria-label="Link to this section">#</a></h2>
<p>A signature that leaves no durable trace protects nobody, including the person who gave it.</p>
<p>What has to survive: who signed, when, on what basis, on which version of the document, and — where a delegation was used — for whom. That record must be one that cannot be quietly revised afterwards, which is the whole subject of <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>.</p>
<p>And the record should protect the approver as much as the company. A person who signed something correctly, on the information available at the time, should be able to demonstrate that years later. That is not a side benefit. It is a large part of why people are willing to sign at all.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Two different people on every payment, with no amount below which the rule lapses.</p>
<p>Delegate in bounded, revocable windows that can never put both signatures in one pair of hands. Make overrides loud rather than removing them. Keep the queue about money that has not yet moved, so the second reading stays a real one.</p>
<p>Every erosion of this arrives as a convenience, and each one is reasonable on its own. That is precisely why the floor has to be stated as a floor.</p>]]></content:encoded></item>
<item><title>Money before material, and how to sign for it honestly</title><link>https://be-teck.com/blog/money-before-material/</link><guid isPermaLink="true">https://be-teck.com/blog/money-before-material/</guid><pubDate>Tue, 01 Sep 2026 04:20:00 +0530</pubDate><description>Paying before delivery is normal in construction. What is not normal is a system that hides which payments are advances and which are for goods already in.</description><category>money</category><category>procurement</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A great deal of construction purchasing requires money to move before anything arrives. Suppliers of commodity materials often will not dispatch against credit. Fabricated items require a deposit. Concrete plants take payment before a truck rolls.</p>
<p>This is not a bad practice to be eliminated. It is the market. The problem is not that money goes first — it is that the record of a payment usually does not say whether it went first, and by the time anybody asks, the two cases look identical.</p>
<p>For a developer it compounds, because money leaves on the contractor's ladder before it arrives on the buyer's — <a href="https://be-teck.com/blog/two-payment-ladders/">two payment ladders that never line up</a>.</p>
<h2 id="the-two-payments-that-look-the-same">The two payments that look the same<a class="anchor" href="#the-two-payments-that-look-the-same" aria-label="Link to this section">#</a></h2>
<p>Payment A: material was delivered, checked and received; the invoice was matched; the money went out afterwards.</p>
<p>Payment B: money went out so that material would be dispatched; nothing has arrived yet.</p>
<p>On a bank statement these are the same event. In most purchase ledgers they are the same event. And the difference between them is the entire risk position of the company: in the first case you have the goods, in the second you have a promise.</p>
<p>An organisation that cannot separate these cannot answer the only question that matters in a bad week — <em>how much have we paid for material we do not yet have?</em></p>
<h2 id="asking-at-the-moment-of-signature">Asking at the moment of signature<a class="anchor" href="#asking-at-the-moment-of-signature" aria-label="Link to this section">#</a></h2>
<p>The moment to establish this is when somebody is authorising the payment, because that is the only moment when a person is looking at it who knows the answer.</p>
<p>In our own approvals queue, every payment awaiting signature now says one of two things: that delivery documents have been filed against it, or, in amber, that none have — <em>no delivery challan yet — money before material?</em></p>
<p>It is a question, not a block. That distinction was deliberate and it is the part worth copying. A hard rule refusing payment without a delivery record would be wrong on a large fraction of legitimate purchases, and a rule that is wrong that often teaches people to find the override. Once the override is routine you have neither a rule nor a question.</p>
<p>What the question does is make the signer aware that they are making a choice rather than having one made for them. Some payments rightly precede material. The person signing is entitled to know which kind this is.</p>
<h2 id="why-the-question-was-harder-to-build-than-it-looks">Why the question was harder to build than it looks<a class="anchor" href="#why-the-question-was-harder-to-build-than-it-looks" aria-label="Link to this section">#</a></h2>
<p>The obvious implementation is to ask whether any delivery document is attached to this order. Ours did that, and for a long time it was structurally incapable of ever saying yes.</p>
<p>The document matcher only offered a delivery record against purchases that had <strong>not</strong> been paid. But in our process payment usually precedes dispatch. So by the time material arrived and somebody photographed the slip, the correct purchase was always in the paid state and was therefore never a candidate. The document matched nothing, and a document matched to nothing appears on no screen at all.</p>
<p>Every payment showed <em>no delivery challan yet</em>, permanently, including the ones where material had arrived weeks earlier and been photographed properly. An amber warning that is always on is not a warning. It is wallpaper, and within a fortnight nobody sees it.</p>
<p>The fix was one sentence: paid purchases are offered the match too, closed ones still are not — a closed order being the real test of a finished purchase. The general lesson is more useful than the fix. <strong>A check that cannot ever pass is worse than no check</strong>, because it consumes the attention a real warning would have needed.</p>
<h2 id="what-has-to-be-recorded">What has to be recorded<a class="anchor" href="#what-has-to-be-recorded" aria-label="Link to this section">#</a></h2>
<p>Four fields turn a payment into something you can reason about later.</p>
<p><strong>Its type.</strong> Advance against order, payment on delivery, stage payment, retention release, mobilisation advance. These have different futures and different recovery mechanics — the difference between the last two is set out in <a href="https://be-teck.com/blog/mobilisation-advance/">a mobilisation advance is not an advance payment</a>.</p>
<p><strong>What it is against.</strong> An order, a contract, a stage. A payment attached only to a vendor name cannot be reconciled against anything.</p>
<p><strong>Whether material has been received against it</strong>, as a fact that updates when material arrives, not a checkbox somebody ticks at payment time.</p>
<p><strong>What was expected in return, and by when.</strong> Without this, an advance that is never fulfilled simply ages quietly. With it, the gap between the payment and the expected delivery becomes a date that can be chased.</p>
<h2 id="the-exposure-report-nobody-has">The exposure report nobody has<a class="anchor" href="#the-exposure-report-nobody-has" aria-label="Link to this section">#</a></h2>
<p>Given those four fields, one report becomes possible, and it is the point of the whole exercise:</p>
<blockquote><p>Money paid, against material not yet received, by vendor, by age.</p></blockquote>
<p>Almost nobody can produce this. It is the clearest statement of counterparty exposure a construction business has, and it is usually reconstructible only by a person going through orders one at a time.</p>
<p>Ageing matters as much as the total. An advance a week old is normal trading. The same advance six months old, to a vendor who has gone quiet, is a different kind of number, and it is exactly the kind that surfaces at year end when somebody asks why an order is still open.</p>
<h2 id="advances-and-the-signature-that-follows-them">Advances and the signature that follows them<a class="anchor" href="#advances-and-the-signature-that-follows-them" aria-label="Link to this section">#</a></h2>
<p>There is a sequencing trap worth naming.</p>
<p>If money goes out before the order is fully approved — because a supplier demanded payment to hold a rate, because somebody was on site and made a decision — then the approval that follows is a formality applied to a fact. Everybody involved knows the signature cannot change anything.</p>
<p>That situation should be recorded as what it is: money that moved without a prior sign-off, in its own list, where the question is <em>who authorised this</em> rather than <em>shall we</em>. Putting it into the ordinary approvals queue is worse than useless — it fills the queue with decisions that cannot be made and trains signers to click through. The argument about keeping an approvals queue about live decisions is in <a href="https://be-teck.com/blog/two-signatures-on-money/">why one person should never move the company's money</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Paying before delivery is ordinary in construction. Failing to record which payments those were is not.</p>
<p>Mark the type at payment, attach it to an order, let the delivery record update the position when material actually arrives, and put the question in front of the person signing — as a question, because a block would be wrong too often to survive.</p>
<p>Then you can answer the one question a purchase ledger is really for: what have we paid for that we do not yet have. The mechanics of matching an arriving delivery back to the payment it belongs to are in <a href="https://be-teck.com/blog/three-way-matching/">three-way matching</a>.</p>]]></content:encoded></item>
<item><title>Matching a bank line to the thing it paid for</title><link>https://be-teck.com/blog/matching-a-bank-line/</link><guid isPermaLink="true">https://be-teck.com/blog/matching-a-bank-line/</guid><pubDate>Tue, 01 Sep 2026 04:10:00 +0530</pubDate><description>A bank statement gives a date, an amount and a scrap of text. Turning that into "this paid that invoice" is a guess, and the rules around the guess matter.</description><category>accounts</category><category>money</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A bank statement line contains a date, an amount, a direction, and a fragment of text produced by a system that was not designed to help you.</p>
<p>Somewhere in your records is the thing that line paid for. Connecting the two is bank reconciliation, and although it is treated as clerical work, it is mostly inference — which means it can be wrong, and being wrong has consequences that outlive the mistake.</p>
<h2 id="what-evidence-actually-exists">What evidence actually exists<a class="anchor" href="#what-evidence-actually-exists" aria-label="Link to this section">#</a></h2>
<p>Four kinds, of very different quality.</p>
<p><strong>An exact amount match.</strong> Strong, when amounts are distinctive. Weak when they are round numbers, because round numbers recur.</p>
<p><strong>A reference in the narration.</strong> The strongest evidence there is, when it exists. It usually does not, or it exists in a mangled form. Receipts from flat buyers are the same problem in bulk, arriving against a reference printed on <a href="https://be-teck.com/blog/the-demand-letter/">the demand letter</a> and almost never quoted back.</p>
<p><strong>A name in the narration.</strong> Good, if you can map bank narration strings to your vendors. Those strings are inconsistent, abbreviated and occasionally belong to a payment processor rather than the vendor.</p>
<p><strong>Timing and recency.</strong> The weakest. Everything that happened this week is temporally close to everything else that happened this week.</p>
<p>The failure mode is treating a weak signal as sufficient because no strong one is available.</p>
<h2 id="the-near-miss-amount">The near-miss amount<a class="anchor" href="#the-near-miss-amount" aria-label="Link to this section">#</a></h2>
<p>We built a matcher that got this wrong, in a way worth describing because the mistake is so natural.</p>
<p>A transfer came in at an amount close to — but not equal to — the amount outstanding on a particular order. The matcher proposed the two as a pair, on nothing but that closeness. Its own explanation for the proposal read, in effect, <em>no name, but the amount is close</em>.</p>
<p>Close amounts are extremely common. Any organisation with a few hundred open items has several within a few per cent of any given figure, and a rule that accepts closeness will pair transactions with orders that have nothing to do with each other.</p>
<p>The rule now is that <strong>a near-miss amount alone is not evidence</strong>. It needs something beside it — a vendor name in the narration, a known alias, a label learnt from a previous confirmed match. An exact match still stands on its own, and so does an amount that reconciles arithmetically with tax added, because that is a computed relationship rather than a coincidence.</p>
<p>The general principle: closeness is not evidence, it is an absence of contradiction. Those feel similar and are not remotely the same thing.</p>
<h2 id="the-candidate-pool-that-never-emptied">The candidate pool that never emptied<a class="anchor" href="#the-candidate-pool-that-never-emptied" aria-label="Link to this section">#</a></h2>
<p>The second fault we found was subtler and had been quietly poisoning matches for months.</p>
<p>A payment made in stages never set the field meaning <em>this is paid</em>, because when a payment has a schedule, the stages <strong>are</strong> the payment record. So a fully settled order stayed in the matcher's candidate pool for ever, at its full original amount, permanently available to be matched against some future transaction that happened to be near it.</p>
<p>The pool was not a list of things awaiting payment. It was a list of everything that had ever awaited payment, and it grew without limit.</p>
<p>The correction was to treat a fully answered schedule as a settlement timed at its last stage, kept in the pool only through the same short proof window a hand-marked payment gets, and to make "remaining" actually subtract the advance. The same missing fact had leaked into eight other places in the application; the whole account is <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>, and the version of it aimed at accounting systems is <a href="https://be-teck.com/blog/staged-payments-and-accounting/">why staged payments break accounting systems</a>.</p>
<h2 id="never-attach-on-the-machines-own-authority">Never attach on the machine's own authority<a class="anchor" href="#never-attach-on-the-machines-own-authority" aria-label="Link to this section">#</a></h2>
<p>This is the rule we hold to hardest, and it came from the owner of the business rather than from the engineering side: <strong>never auto-link anything.</strong></p>
<p>A machine match is recorded as a <strong>suggestion</strong>. It carries its score and its reasoning. A person taps to confirm or to reject, and both answers are permanent — a rejection is remembered so the same wrong pair is never proposed again.</p>
<p>The reason is not that machines are unreliable. It is that an automatic attachment leaves behind a record indistinguishable from a human decision. Six months later somebody reads "this transaction paid that invoice" and has no way of knowing that nobody ever agreed. The error is not the wrong pairing; it is the false confidence in the record afterwards. That argument, in full, is <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<p>When we adopted this rule we also had to convert matches the machine had already made on its own authority back into suggestions, in the same migration that introduced the rule. There is no honest alternative: a record created by a mechanism you have since decided was not trustworthy does not become trustworthy by being old.</p>
<h2 id="the-evidence-floor-has-to-be-everywhere">The evidence floor has to be everywhere<a class="anchor" href="#the-evidence-floor-has-to-be-everywhere" aria-label="Link to this section">#</a></h2>
<p>A subtlety that cost us a round of fixes: it is not enough for the main matcher to have a high evidence standard.</p>
<p>The same suggestions appeared in a second place — a per-row list on the money page — and that list had been written separately, with its own scoring, at a lower threshold. So a pairing the main matcher would have refused was being offered as a one-tap action somewhere else in the application.</p>
<p>One rule, one implementation, asked by every surface. Two implementations of the same rule will diverge, and the divergence is silent because each is internally consistent.</p>
<h2 id="undo-must-be-complete">Undo must be complete<a class="anchor" href="#undo-must-be-complete" aria-label="Link to this section">#</a></h2>
<p>When somebody attaches a transaction and then undoes it, the undo has to clear everything the attachment created: the comment, the notification, and the open suggestion it answered.</p>
<p>We found that a stale suggestion card kept rendering on a task the money had never belonged to, because undoing the attachment did not close the question that prompted it. Half-undone states are worse than either the original error or a clean reversal, because they present as current information.</p>
<h2 id="what-a-good-matcher-looks-like">What a good matcher looks like<a class="anchor" href="#what-a-good-matcher-looks-like" aria-label="Link to this section">#</a></h2>
<ul><li>Exact matches, proposed with high confidence, still confirmed by a person.</li><li>Near matches, proposed only with corroborating evidence, with the reasoning shown.</li><li>No proposal at all where the evidence floor is not met — an honest empty result rather than a weak guess.</li><li>Rejections remembered permanently.</li><li>One implementation of the rule, asked by every screen.</li><li>Complete undo.</li></ul>
<p>None of that is clever. All of it is the difference between a reconciliation that saves work and one that creates a category of quiet error nobody can find later.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Matching a bank line is inference from weak evidence. Amount closeness is not evidence. A candidate pool that never empties will eventually match something wrongly.</p>
<p>And whatever the machine concludes, a person taps. The cost of an automatic wrong link is not the link. It is that it looks like somebody decided.</p>]]></content:encoded></item>
<item><title>Writing off money that is never coming</title><link>https://be-teck.com/blog/writing-off-money/</link><guid isPermaLink="true">https://be-teck.com/blog/writing-off-money/</guid><pubDate>Tue, 01 Sep 2026 04:00:00 +0530</pubDate><description>A write-off is a decision, not a correction. The amount matters less than the reason, and the reason is the first thing most systems throw away.</description><category>accounts</category><category>money</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>At some point somebody decides that an amount owed will not be received, or an amount payable will never be claimed, and the balance is written off.</p>
<p>The number changes and the ledger balances. That part is easy. What matters about a write-off is not the arithmetic at all — it is that a person made a judgement, and the judgement is the thing worth keeping.</p>
<h2 id="a-write-off-is-not-a-correction">A write-off is not a correction<a class="anchor" href="#a-write-off-is-not-a-correction" aria-label="Link to this section">#</a></h2>
<p>Three operations look similar on a balance and are completely different in character:</p>
<p><strong>A correction</strong> fixes something that was recorded wrongly. The balance was never real. There is a right answer and you are moving to it.</p>
<p><strong>A short payment</strong> settles for less by agreement. The balance is not owed because both parties said so. Its mechanics are in <a href="https://be-teck.com/blog/paying-less-than-agreed/">paying less than agreed</a>.</p>
<p><strong>A write-off</strong> accepts that a real, valid balance will not be collected or paid. Nothing was wrong. Somebody has decided to stop pursuing it.</p>
<p>Only the third involves a judgement about the future, and only the third carries a reason that somebody may need to defend. Systems that offer one mechanism for all three end up with a ledger in which nobody can tell an error from a decision.</p>
<h2 id="who-is-allowed-to-decide">Who is allowed to decide<a class="anchor" href="#who-is-allowed-to-decide" aria-label="Link to this section">#</a></h2>
<p>Writing off is giving up money. It should sit at least as high in the authority structure as spending the same amount, and frequently it does not — because spending has a form and a queue, while writing off is often just an edit on a screen.</p>
<p>Two properties are worth insisting on.</p>
<p><strong>Authority proportional to amount, like any other financial decision.</strong> If two people are needed to pay a sum, two people should be needed to abandon the same sum. The reasoning behind that floor is in <a href="https://be-teck.com/blog/two-signatures-on-money/">why one person should never move the company's money</a>.</p>
<p><strong>Never available to the person whose performance the balance reflects.</strong> Somebody responsible for collection should not be able to make an uncollectible balance disappear, for the ordinary reason that it removes the evidence of the thing they are measured on.</p>
<h2 id="the-reason-is-the-record">The reason is the record<a class="anchor" href="#the-reason-is-the-record" aria-label="Link to this section">#</a></h2>
<p>Once a balance is written off, the only surviving trace of the whole episode is whatever reason was recorded.</p>
<p>That reason has to answer three questions asked later, usually by an auditor, occasionally by a court:</p>
<ul><li><strong>Why was it not collectible?</strong> Vendor dissolved, dispute settled, cost of pursuit exceeded the amount, work never accepted.</li><li><strong>What was attempted first?</strong> A write-off with no history of pursuit looks very different from one following a documented sequence of chasing.</li><li><strong>Who decided, and when?</strong></li></ul>
<p>"Adjustment" answers none of these, and "adjustment" is what a free-text field with no guidance receives.</p>
<p>We refused, in our own system, to allow a payment schedule containing written-off stages to be deleted. Deleting it would have been convenient — the schedule was cluttering a page — and it would have taken with it every recorded reason for every write-off on it. Those reasons are the only surviving answer to who decided the money would never come. The refusal is deliberate and it occasionally annoys people, which is roughly the right outcome for a control.</p>
<h2 id="the-write-off-that-races-a-payment">The write-off that races a payment<a class="anchor" href="#the-write-off-that-races-a-payment" aria-label="Link to this section">#</a></h2>
<p>A small technical failure with a large consequence, and it is worth understanding because the shape recurs everywhere.</p>
<p>Our write-off routine read the record, confirmed it was not paid, and then wrote the write-off. Two separate steps. If a payment landed in the gap between the read and the write — which is a matter of milliseconds, and therefore happens — the write-off proceeded anyway and papered over a payment that had just been received.</p>
<p>Nothing errored. The balance was zero either way. But the ledger recorded <em>abandoned</em> for money that had actually arrived.</p>
<p>The fix was to make the condition travel with the write, so the update itself refuses if the state has changed since it was read, rather than checking first and trusting the world to hold still.</p>
<p>The general form: <strong>any check followed by an action is a race unless the check is part of the action.</strong> In financial code this is not a theoretical concern. It is the mechanism behind double payments, double refunds and reversals of things that were never done.</p>
<h2 id="ageing-is-what-prevents-the-ambush">Ageing is what prevents the ambush<a class="anchor" href="#ageing-is-what-prevents-the-ambush" aria-label="Link to this section">#</a></h2>
<p>Write-offs are unpleasant partly because they arrive in clusters at year end, when somebody finally goes through open items.</p>
<p>The remedy is boring: age receivables and payables continuously, in bands, and put the old ones in front of somebody monthly. A balance that has been visibly ageing for six months is a decision waiting to be made. The same balance discovered in March is a surprise, and surprises get resolved under time pressure by whoever is in the room.</p>
<p>This connects to something structural. Old open items are very often not uncollectible at all — they are <a href="https://be-teck.com/blog/staged-payments-and-accounting/">payments made in stages that the system never recognised as settled</a>, or deliveries never matched to their order, or advances never recovered. Writing those off is not a commercial decision; it is destroying evidence of a data problem.</p>
<p>So the sequence matters: reconcile first, then age, then write off what is genuinely left. The reconciliation that settles most of them is against the other party's own ledger — <a href="https://be-teck.com/blog/when-your-ledger-and-theirs-disagree/">when your ledger and theirs disagree</a>. Writing off first is faster and it hides the thing that would have prevented the next twenty.</p>
<h2 id="reversal-and-why-it-must-exist">Reversal, and why it must exist<a class="anchor" href="#reversal-and-why-it-must-exist" aria-label="Link to this section">#</a></h2>
<p>Occasionally a written-off amount is recovered. A vendor pays after all; a disputed claim settles.</p>
<p>That must be recordable, and it must be recordable as a <strong>reversal of a specific write-off</strong>, not as fresh income from nowhere. Otherwise the write-off history overstates losses, the recovery understates their relationship, and the pattern that would tell you which write-offs were premature is invisible.</p>
<p>The requirement is the same one that applies to every correction in a financial record: entries are added, never edited, and the history stays readable. That principle has its own piece — <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A write-off is a decision to stop pursuing a real balance.</p>
<p>Keep it distinct from a correction and from a settlement, put it at the same authority level as spending the same money, and never let the person measured on the balance be the one who erases it.</p>
<p>Make the reason a required, structured field, refuse to delete anything that carries those reasons, and reconcile before you age and age before you write off.</p>
<p>The number is the least valuable part of the record.</p>]]></content:encoded></item>
<item><title>Why tasks stall between people</title><link>https://be-teck.com/blog/why-tasks-stall-between-people/</link><guid isPermaLink="true">https://be-teck.com/blog/why-tasks-stall-between-people/</guid><pubDate>Tue, 01 Sep 2026 03:50:00 +0530</pubDate><description>Work rarely stops because somebody refused. It stops in the handover, where one person has finished and the next has not been told they are now waiting on.</description><category>site</category><category>gaps</category><category>how-we-work</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Ask why a piece of work is late and you will usually be told about the person holding it.</p>
<p>That is almost never where the time went. The time went in the gaps between people — the intervals when a task had been finished by one person and had not yet started with the next, because the next person did not know it was theirs.</p>
<h2 id="the-three-kinds-of-stall">The three kinds of stall<a class="anchor" href="#the-three-kinds-of-stall" aria-label="Link to this section">#</a></h2>
<p><strong>Nobody knows it is theirs.</strong> The most common by a wide margin. The work moved on and the notification did not, or arrived somewhere nobody looks.</p>
<p><strong>Everybody thinks it is somebody else's.</strong> A task with two names on it and no statement of who acts. Diffusion of responsibility is not a failure of character; it is what happens when a system permits ambiguity. The same thing at the scale of a project is <a href="https://be-teck.com/blog/one-project-many-contractors/">one project, many contractors</a>, where the delay sits in the handover between two trades rather than inside either.</p>
<p><strong>Somebody knows it is theirs and is blocked.</strong> The only one of the three that is visible, and consequently the only one that gets managed.</p>
<p>Most attention goes to the third. Most of the delay is in the first two.</p>
<h2 id="the-stall-nobody-can-report">The stall nobody can report<a class="anchor" href="#the-stall-nobody-can-report" aria-label="Link to this section">#</a></h2>
<p>A document was sent for signature in our own system. It sat there. The person who had to sign it did not know they had to sign it.</p>
<p>They were not ignoring it, and they had not missed a message. The message had arrived exactly as the system intended, and the way the system intended was wrong. The request went out carrying a generic type — <em>question</em> — which had been mapped, sensibly enough, onto the row for comments in the notification grid. That row's default delivery is a digest: held back until the next scheduled broadcast, ringing nothing, arriving as one line among a dozen others that did not need doing right now.</p>
<p>A document holding up a payment was delivered as chatter. The full account is <a href="https://be-teck.com/blog/filed-as-chatter/">filed as chatter</a>.</p>
<p>The important part is why nobody reported it. The person who had to sign did not know there was anything to report — from where they stood, nothing had happened. The person who sent it assumed it had landed, because sending it produced no error. Both held a completely consistent picture of the day, and the two pictures did not overlap at the point where the work was stuck.</p>
<p>That is the most durable kind of stall. It has no owner because nobody experiences it as a problem.</p>
<h2 id="what-a-request-has-to-say">What a request has to say<a class="anchor" href="#what-a-request-has-to-say" aria-label="Link to this section">#</a></h2>
<p>The useful question about any handover is not how important it is. Everybody's own work is important, and a priority scale where everything is at the top is not a scale.</p>
<p>The useful question is <strong>what it asks the reader to do</strong>, and there are only three answers:</p>
<ul><li>Nothing. You should know this happened. Read it whenever.</li><li>Later. Look at this next time you are looking at things.</li><li>Now. Somebody is standing still until you act.</li></ul>
<p>A signature request is always the third. It is not information about work; it is a request for a specific person's hand, and until that hand moves a document, a payment and usually another human being are all stopped.</p>
<p>Classify by what is being asked rather than by how important it feels, and the routing follows without anybody having to argue about priority. The wider argument is in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<h2 id="make-the-waiting-visible-from-both-ends">Make the waiting visible from both ends<a class="anchor" href="#make-the-waiting-visible-from-both-ends" aria-label="Link to this section">#</a></h2>
<p>A stall persists because it is invisible to the two people best placed to end it.</p>
<p>The person waiting often cannot see what they are waiting on — only that nothing has happened. The person holding it cannot see that anybody is waiting.</p>
<p>Two cheap fixes cover most of it.</p>
<p><strong>A standing statement on the work itself</strong>, in plain words: what it is waiting for, who it is waiting on, and how long it has been waiting. Not a status code. A sentence. We added exactly this to every task in our own system after watching people ask the same three questions in meetings that a line of text could have answered.</p>
<p><strong>A view of what is waiting on me</strong>, that is genuinely complete. Incomplete is worse than absent, because a list that misses things teaches people they still have to check everywhere else, and then they stop using the list.</p>
<h2 id="the-pause-that-nobody-owns">The pause that nobody owns<a class="anchor" href="#the-pause-that-nobody-owns" aria-label="Link to this section">#</a></h2>
<p>There is a specific structural stall worth naming: the interval where a task has left one stage and not yet entered the next.</p>
<p>Approved but not yet issued. Signed but not yet filed. Received but not yet booked. Ready but not yet started.</p>
<p>These intervals have no assignee by definition, and most systems represent them as a status rather than as somebody's work. So no queue contains them, no reminder covers them, and they can last indefinitely without appearing anywhere as late.</p>
<p>The fix is to make every state have an owner, including the transitional ones. If the answer to "whose is it right now" is "nobody's, it is between stages", the process has a hole and the hole will fill with time. Where the next actor is outside the company altogether, that owner belongs in a different system — <a href="https://be-teck.com/blog/crm-or-task-system/">a CRM and a task system are not the same thing</a>.</p>
<h2 id="chasing-is-a-finite-resource">Chasing is a finite resource<a class="anchor" href="#chasing-is-a-finite-resource" aria-label="Link to this section">#</a></h2>
<p>The instinct once stalls are visible is to add reminders. It works briefly.</p>
<p>A reminder that is occasionally wrong teaches people to skim the whole class of reminder, and once they skim it, the one that matters costs the same as the ones that do not. We watched a chaser ring our finance team every few days about money that had already left the account, because of a stale field elsewhere in the system. Nobody reported it. They just stopped reading that kind of message, and the credibility spent was not spent only on that chaser — it was spent on every chaser in the building.</p>
<p>So: fewer, better-targeted, and correct. A chasing system's accuracy is not a nice-to-have. It is the whole asset.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Work stalls in the gaps, not in the hands.</p>
<p>Classify requests by what they ask a person to do, give every state an owner including the transitional ones, put a plain sentence on the work saying what it is waiting for, and keep reminders rare enough and right enough to still be read.</p>
<p>And when something has been stuck for a month, look first at how the request was categorised on its way to the person who was supposed to act on it. The answer is usually a row in a routing table, not a failure of diligence.</p>]]></content:encoded></item>
<item><title>What makes a handover fail</title><link>https://be-teck.com/blog/what-makes-a-handover-fail/</link><guid isPermaLink="true">https://be-teck.com/blog/what-makes-a-handover-fail/</guid><pubDate>Tue, 01 Sep 2026 03:40:00 +0530</pubDate><description>A handover fails when knowledge that lived in one person's head was never written down, and nobody discovers which knowledge that was until it is needed.</description><category>site</category><category>how-we-work</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Somebody leaves a role. Somebody else takes it on. There is a period of overlap, a document, perhaps a meeting, and then the first person is gone.</p>
<p>Three months later something goes wrong that would not have gone wrong before, and the explanation is always the same shape: <em>he knew how to handle that.</em></p>
<h2 id="why-handover-documents-miss-the-important-things">Why handover documents miss the important things<a class="anchor" href="#why-handover-documents-miss-the-important-things" aria-label="Link to this section">#</a></h2>
<p>Because the important things do not feel like knowledge to the person who has them.</p>
<p>Anybody doing a job for a few years has absorbed a large body of situational knowledge that they no longer experience as knowledge. Which supplier's delivery notes are always short by a bag. Which approval genuinely needs chasing and which arrives on its own. Which of two similarly named items in the system is the one actually used. That the report on Tuesday is wrong unless you run the other one first.</p>
<p>None of this appears in a handover document, because a handover document is written by asking somebody what they do, and people answer that question by describing their formal responsibilities.</p>
<p>This is the same mechanism that hides ordinary defects from the people living with them. A problem that survives longer than a month or two stops being experienced as a problem and gets absorbed into the description of the job. We wrote about that at length in <a href="https://be-teck.com/blog/the-gap-you-stopped-noticing/">the gap you stopped noticing</a>. Handover surfaces the same blindness under time pressure.</p>
<h2 id="the-three-categories-and-only-one-of-them-transfers-well">The three categories, and only one of them transfers well<a class="anchor" href="#the-three-categories-and-only-one-of-them-transfers-well" aria-label="Link to this section">#</a></h2>
<p><strong>Documented process.</strong> Transfers fine. It is written down, it can be read. This is what handover documents contain, and it is the least valuable third.</p>
<p><strong>Undocumented routine.</strong> The daily and monthly things nobody wrote down because they are too obvious to mention. Partly transferable, if the overlap period is long enough for the successor to watch a full cycle. A month is not a full cycle for anything with a quarterly component.</p>
<p><strong>Judgement and relationships.</strong> Which vendor will actually turn up on a Sunday. Which colleague to ask before formally raising something. What the unwritten tolerance is on a particular measurement. Barely transferable at all in a handover, and it is often the majority of what made the person good.</p>
<p>Knowing which of the three you are losing tells you what to do. The first needs nothing. The second needs a longer overlap covering a real cycle. The third needs relationships to be introduced deliberately, one at a time, rather than listed.</p>
<h2 id="ask-about-workarounds-not-about-duties">Ask about workarounds, not about duties<a class="anchor" href="#ask-about-workarounds-not-about-duties" aria-label="Link to this section">#</a></h2>
<p>The single most productive handover question is not "what do you do".</p>
<p>It is: <strong>what do you work around?</strong></p>
<p>Ask it out loud and wait through the pause. The answers do not come as complaints. They come as instructions, delivered helpfully, in the tone of somebody explaining how a door has to be lifted before it will close. <em>Oh, you have to enter it twice, the first one never saves. Don't use that report, use this one. Ring him rather than emailing, he doesn't check.</em></p>
<p>Every one of those is a piece of load-bearing knowledge that no document would have captured, because from the inside it is not knowledge — it is just how the job is done.</p>
<p>It is also, incidentally, a free audit of your own systems. Each workaround is a defect somebody has been quietly staffing. We found an entire class of these in our own software — features that had been built and had never been given a button, so a workaround was doing the job instead and nobody had ever filed a request. The story is <a href="https://be-teck.com/blog/written-and-never-wired/">written, and never wired</a>.</p>
<h2 id="the-things-that-actually-break">The things that actually break<a class="anchor" href="#the-things-that-actually-break" aria-label="Link to this section">#</a></h2>
<p>In practice, handover failures cluster in a small number of places.</p>
<p><strong>Access.</strong> Accounts, keys, permissions, and the one system nobody remembered because it is used twice a year. The successor discovers the gap at the moment they need it, which is the worst moment.</p>
<p><strong>Recurring obligations with long periods.</strong> Anything annual. A renewal, a return, a certificate, an inspection. The predecessor did it eleven months ago and will not think of it; the successor has never seen it happen.</p>
<p><strong>Relationships that were personal.</strong> A supplier who gave good service because of a person, not because of a contract. This degrades quietly over months and is usually attributed to the supplier.</p>
<p><strong>In-flight decisions.</strong> Anything half-negotiated. The state of a discussion lives in somebody's head and in a set of messages nobody else can read, which is the same reason <a href="https://be-teck.com/blog/the-snag-list-that-closes/">a snag list that actually closes</a> gives every item an identifier and a named owner rather than a wording.</p>
<p><strong>Undocumented commitments.</strong> Something promised verbally that the records do not show. These surface as accusations of bad faith.</p>
<h2 id="what-a-handover-should-actually-produce">What a handover should actually produce<a class="anchor" href="#what-a-handover-should-actually-produce" aria-label="Link to this section">#</a></h2>
<p>Not a document. A set of artefacts that outlive the meeting.</p>
<ul><li><strong>A calendar with the annual and quarterly obligations on it</strong>, each with the name of whoever must be told and roughly what is involved. This is worth more than everything else combined.</li><li><strong>A list of access held</strong>, including the awkward ones — shared logins, a physical key, an account in somebody's personal name.</li><li><strong>A written list of in-flight items</strong> with their current state and who the other party is.</li><li><strong>Introductions made in person</strong> to the five or six relationships that matter, with the predecessor present and saying so.</li><li><strong>The workaround list</strong>, from the question above, in their own words.</li></ul>
<p>Notice that four of the five are lists of specific facts rather than descriptions of a role. Roles do not transfer. Facts do.</p>
<p>The same test decides what goes into the document set handed over at the end of a project — <a href="https://be-teck.com/blog/the-handover-file/">what belongs in a handover file</a>.</p>
<h2 id="overlap-is-not-the-same-as-availability">Overlap is not the same as availability<a class="anchor" href="#overlap-is-not-the-same-as-availability" aria-label="Link to this section">#</a></h2>
<p>"Ring me if you need anything" is offered sincerely and used twice.</p>
<p>The successor will not ring, for ordinary human reasons: they do not want to look incapable, they do not know what they do not know, and after a fortnight it feels like an imposition. Availability is not a handover mechanism, and planning around it is how organisations end up depending on the goodwill of somebody who no longer works there.</p>
<p>If knowledge has not moved during the overlap, it has not moved.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Handovers fail on the knowledge the departing person does not know they have.</p>
<p>Ask what they work around rather than what they do. Cover a full cycle, not a convenient window. Produce lists of specific facts — obligations, access, in-flight items, relationships — rather than a description of the role.</p>
<p>And treat every workaround you uncover as a defect report, because that is exactly what it is. The related failure, where work stops in the gap between two people who both think it is with the other, is covered in <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">why tasks stall between people</a>.</p>]]></content:encoded></item>
<item><title>A gate register somebody will actually keep</title><link>https://be-teck.com/blog/a-gate-register-people-keep/</link><guid isPermaLink="true">https://be-teck.com/blog/a-gate-register-people-keep/</guid><pubDate>Tue, 01 Sep 2026 03:30:00 +0530</pubDate><description>The gate is the only place every lorry passes. Most gate registers fail for design reasons, not discipline ones — they were built for a desk, not a barrier.</description><category>site</category><category>records</category><category>field</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every vehicle that brings material onto a site passes one point. Every vehicle that takes anything away passes the same point. The gate is the only complete census of physical movement a project has, and it is usually kept in a ledger that nobody reads until there is an argument.</p>
<p>The reason gate registers fail is almost never discipline. It is that they were designed by somebody sitting down, for somebody who is standing up.</p>
<h2 id="what-the-gate-is-uniquely-good-for">What the gate is uniquely good for<a class="anchor" href="#what-the-gate-is-uniquely-good-for" aria-label="Link to this section">#</a></h2>
<p>Three things nothing else on a site can do.</p>
<p><strong>It sees everything.</strong> Stores see what reaches the store. Accounts see what is invoiced. The gate sees the vehicle, including the ones that turn round, the ones that go to the wrong site, and the ones nobody was expecting.</p>
<p><strong>It fixes a time.</strong> A delivery has a moment, and that moment is often the only way to distinguish two similar loads from the same vendor on the same day.</p>
<p><strong>It is the last point before commitment.</strong> After the barrier, material is on your site and getting it off again is a conversation. Before it, refusal is cheap.</p>
<h2 id="what-kills-a-gate-register">What kills a gate register<a class="anchor" href="#what-kills-a-gate-register" aria-label="Link to this section">#</a></h2>
<p><strong>Too many fields.</strong> Every additional field reduces the completeness of all the others, because there is a fixed amount of time while a driver waits. A register with eighteen columns is filled in with four.</p>
<p><strong>Fields that require lookups.</strong> Purchase order number, item code, vendor code. The person at the gate does not have these and cannot get them. Anything that requires leaving the barrier to look something up will be guessed or left blank.</p>
<p><strong>Writing in conditions that do not permit writing.</strong> Rain, dark, one hand on a torch. A paper register in a shed twenty metres from the barrier is filled in afterwards from memory, which is the same as not having one.</p>
<p><strong>No feedback.</strong> Nobody at the gate ever finds out whether what they wrote was useful. A record that disappears into a system that never answers back is a record whose quality decays, because there is nothing to maintain it against.</p>
<h2 id="the-fields-that-earn-their-place">The fields that earn their place<a class="anchor" href="#the-fields-that-earn-their-place" aria-label="Link to this section">#</a></h2>
<p>For an inbound vehicle: date and time, vehicle number, what it is carrying in ordinary words, who it is from, the <a href="https://be-teck.com/blog/what-is-a-delivery-challan/">delivery challan</a> number if there is one, and who received it.</p>
<p>For an outbound vehicle: date and time, vehicle number, what is leaving, on whose authority, and where it is going.</p>
<p>The outbound half is the one that is usually thin, and it is the half with the security value. A gate that records arrivals meticulously and departures casually is watching the wrong direction.</p>
<p>Two of those fields do most of the work. <strong>Vehicle number</strong> is the handle that connects a gate entry to a store receipt to an invoice, and it is the one thing the person at the barrier can always read. <strong>Time</strong> separates otherwise identical loads.</p>
<h2 id="photograph-rather-than-transcribe">Photograph rather than transcribe<a class="anchor" href="#photograph-rather-than-transcribe" aria-label="Link to this section">#</a></h2>
<p>The single largest improvement available to most sites is to stop transcribing and start capturing.</p>
<p>A photograph of the challan, taken at the barrier, contains every field on it, takes two seconds, requires no lookups, works in the dark with a flash, and cannot be misheard. The transcription can happen later, by somebody at a desk, or by a machine — and if it happens badly, the original is still there.</p>
<p>We built our own capture around exactly this, because it was already happening: site staff were photographing delivery slips into WhatsApp without being asked to, because it is the fastest thing a person holding a phone can do. The software's job was to accept that rather than to ask for something else. There is a longer piece on that principle — <a href="https://be-teck.com/blog/whatsapp-is-the-interface/">WhatsApp is the interface, whether you designed for it or not</a>.</p>
<p>Two warnings from doing it.</p>
<p>Machine-read text from a photograph is a <strong>suggestion</strong>, not a record. It gets digits wrong, and a challan number with a wrong digit is worse than no challan number because it looks usable. A person confirms.</p>
<p>And a photograph without the vehicle number and time attached is much less useful than it seems, because it cannot be placed. Capture those two as fields even when everything else is an image.</p>
<h2 id="the-expected-arrivals-list-and-how-it-goes-wrong">The expected-arrivals list, and how it goes wrong<a class="anchor" href="#the-expected-arrivals-list-and-how-it-goes-wrong" aria-label="Link to this section">#</a></h2>
<p>A good gate screen shows what is expected today. It lets the guard say <em>yes, you are on the list</em> or <em>wait, you are not</em>.</p>
<p>Ours was built to do that, and it had a defect worth describing because it is the sort that hides for a long time.</p>
<p>The list refused any load whose money had not settled, which is sensible. But an order paid in stages never wrote the field that meant <em>this is paid</em> — when a payment has a schedule, the stages <strong>are</strong> the payment record. So a load that had been paid for to the last rupee never reached the list, and a fully-paid lorry arrived at the barrier unannounced.</p>
<p>That is the exact event the screen exists to prevent. It had been prevented in every case except the ones paid in the way the biggest orders are paid. The full account is <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<p>The general warning: an expected-arrivals list is only as good as its completeness, and a list that silently omits a category trains the guard to treat absence as meaningless. Then the list stops doing anything at all. What the barrier needs to be told before a vehicle arrives, and what happens when it has nothing, is <a href="https://be-teck.com/blog/before-the-lorry-reaches-the-gate/">why a lorry surprises the gate</a>.</p>
<h2 id="design-for-the-person-not-the-record">Design for the person, not the record<a class="anchor" href="#design-for-the-person-not-the-record" aria-label="Link to this section">#</a></h2>
<p>Two details that sound trivial and decide whether the whole thing works.</p>
<p><strong>Very large tabular numerals.</strong> A vehicle number read at arm's length in sunlight, entered on a phone by somebody wearing gloves.</p>
<p><strong>Language and pictograms rather than prose.</strong> Gate staff on Indian sites may read neither English nor the language the rest of the application is in. A screen built on symbols, big numbers and the local script works for everybody; a screen built on English labels works for the people who designed it.</p>
<p>We kept our gate screens deliberately untouched during a site-wide typography change for exactly this reason — they had never leaned on English typographic convention in the first place, so they had nothing to lose. That story is in <a href="https://be-teck.com/blog/capitals-are-a-contrast/">capitals are a contrast, not a volume</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The gate sees everything, once, and only briefly.</p>
<p>Cut the fields to what can be captured in the time a driver will wait. Prefer a photograph to a transcription. Make vehicle number and time non-negotiable. Watch the outbound direction as carefully as the inbound one.</p>
<p>And make sure whatever list the guard is checking against is actually complete, because an incomplete list is quickly treated as no list.</p>]]></content:encoded></item>
<item><title>WhatsApp is the interface, whether you designed for it or not</title><link>https://be-teck.com/blog/whatsapp-is-the-interface/</link><guid isPermaLink="true">https://be-teck.com/blog/whatsapp-is-the-interface/</guid><pubDate>Tue, 01 Sep 2026 03:20:00 +0530</pubDate><description>On Indian construction sites the real reporting system is a group chat. Fighting that costs years; reading it properly takes a few weeks and works immediately.</description><category>field</category><category>interface</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every construction organisation in India has an official system for site reporting, and a WhatsApp group where the reporting actually happens.</p>
<p>The official system has forms, fields, validation and a login. The group has photographs, voice notes, half sentences and a great deal of information that never reaches the official system at all.</p>
<p>Most software projects in this space begin by trying to move people from the second to the first. It is a reasonable-sounding plan and it does not work.</p>
<h2 id="why-the-group-wins">Why the group wins<a class="anchor" href="#why-the-group-wins" aria-label="Link to this section">#</a></h2>
<p>Not because people are resistant to change. Because on the measures that matter to somebody standing in the sun, the group is genuinely better.</p>
<p><strong>It is already open.</strong> No login, no app switch, no waiting for a page.</p>
<p><strong>It works on a bad connection</strong>, and it queues and retries without being asked.</p>
<p><strong>It accepts a photograph as a complete message.</strong> A picture of a delivery slip contains everything the form was going to ask for, and takes two seconds.</p>
<p><strong>It accepts speech.</strong> A site engineer sends a voice note because his hands are dusty and the screen is in the sun.</p>
<p><strong>Everybody is already in it</strong>, including the people who will never be given a licence for your software — drivers, contractors' supervisors, the fabricator.</p>
<p><strong>It is forgiving.</strong> No field is mandatory. Nothing is rejected for being incomplete.</p>
<p>A form on a phone competing with that loses on every axis. The competition is not close, and no amount of training changes an outcome that is determined by physics and attention.</p>
<h2 id="the-move-that-works">The move that works<a class="anchor" href="#the-move-that-works" aria-label="Link to this section">#</a></h2>
<p>Stop competing. Read the group.</p>
<p>Treat the messages as the input and do the structuring afterwards, on your side, where somebody has a keyboard and a moment. The person on site changes nothing about what they do.</p>
<p>This is not a lowering of standards. The structured record still gets created, still gets validated, still gets confirmed by a person. What changes is who does the structuring and when, and moving that work off the site and into the office is almost always correct, because the site is the place with the least available attention on the whole project.</p>
<h2 id="what-we-got-wrong-first">What we got wrong first<a class="anchor" href="#what-we-got-wrong-first" aria-label="Link to this section">#</a></h2>
<p>Our software recognised a photograph as a delivery record only if its caption contained one of four words: challan, bilty, GRN, delivery.</p>
<p>Measured against four hundred real captions that the site team had actually sent, those four words matched exactly <strong>two</strong>.</p>
<p>What people really write is the material and a quantity — a grade and a volume and a weight. Or the vehicle and the fact that it has arrived. Or a plain list: a trader's name and then two numbered lines with quantities and units.</p>
<p>Reading those three shapes instead — the material named directly, the vehicle that brought it, or any quantity with a unit — took the match rate from two to thirty-four out of the same four hundred captions.</p>
<p>The vocabulary was never the site's problem. It was ours. A longer piece on that is <a href="https://be-teck.com/blog/the-words-the-site-already-uses/">the words the site already uses</a>.</p>
<p>Fifteen hundred photographs had been sent from site before this was fixed, and not one had ever become a delivery record. That is why no quantity appeared anywhere. Nothing had failed loudly. The photographs kept arriving and kept producing nothing.</p>
<h2 id="voice-notes-are-the-same-problem-again">Voice notes are the same problem again<a class="anchor" href="#voice-notes-are-the-same-problem-again" aria-label="Link to this section">#</a></h2>
<p>Once the pictures were being read, the voice notes were still a labelled blob that nobody opened.</p>
<p>The comment in our own code had known why for over a year — <em>a site engineer sends a voice note because his hands are dusty and the screen is in the sun</em> — and we had done nothing about it.</p>
<p>Transcribing them was the obvious half. The half that mattered was what happens to the words afterwards: a spoken incident report classifies and registers, a spoken answer to an evening question is treated as that answer, a spoken question gets an answer grounded in the records. Same doors, same functions as a typed message takes. Not a parallel path, by construction — because a parallel path is a second implementation of every rule, and second implementations drift.</p>
<p>That piece has its own account: <a href="https://be-teck.com/blog/the-voice-note-is-the-report/">the voice note is the report</a>.</p>
<h2 id="the-rules-that-keep-it-honest">The rules that keep it honest<a class="anchor" href="#the-rules-that-keep-it-honest" aria-label="Link to this section">#</a></h2>
<p>Reading a group chat as an input has real risks, and three rules cover most of them.</p>
<p><strong>Everything the machine concludes is a suggestion.</strong> A photograph that looks like a delivery slip becomes a proposed record, matched to a proposed order, which a person confirms with one tap. Never an automatic entry. The reasoning is in <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<p><strong>Refuse the obvious non-cases loudly rather than guessing.</strong> A cylinder going out for refilling, a photograph of a damaged divider, a weight dispute — these look superficially like delivery messages and are not. A system that files them as receipts is worse than one that files nothing, because somebody now has to find and remove them.</p>
<p><strong>Privacy is a boundary, not a filter.</strong> This one we got wrong and had to fix. Our text extraction ran <em>before</em> the check that knew which rooms were private, so a personal photograph was being read and, if its text resembled a delivery slip, filed as a goods receipt. The correction was not to discard the result afterwards — it was to exclude private rooms at the query, so the bytes are never fetched at all. A privacy control that operates after processing is not a privacy control.</p>
<h2 id="what-you-still-need-the-real-system-for">What you still need the real system for<a class="anchor" href="#what-you-still-need-the-real-system-for" aria-label="Link to this section">#</a></h2>
<p>Reading the chat does not remove the need for a system of record. It changes what the system of record is for.</p>
<p>The chat is where events are reported. The system is where they are confirmed, structured, connected to money and orders, and kept. Signature, authority, audit trail and reconciliation all belong on the system side, and none of them can live in a group chat, for reasons set out in <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>.</p>
<p>The division that works: <strong>the site reports in the medium it already uses; the office confirms in the system that keeps records.</strong> Nobody is asked to change their behaviour to suit software.</p>
<p>The direction back out carries a decision of its own — whether a message leaves from the company or from the colleague the other side already knows: <a href="https://be-teck.com/blog/one-number-or-many-on-whatsapp/">one WhatsApp number, or one per person</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The group chat is not a workaround people will grow out of. It is the interface, because it wins on every dimension that matters to somebody on a site.</p>
<p>Read it. Read it in the vocabulary people actually use, not the vocabulary your forms were written in. Treat everything the machine concludes as a proposal. And keep the record-keeping where records belong.</p>]]></content:encoded></item>
<item><title>Attendance on a site with no signal</title><link>https://be-teck.com/blog/attendance-without-signal/</link><guid isPermaLink="true">https://be-teck.com/blog/attendance-without-signal/</guid><pubDate>Tue, 01 Sep 2026 03:10:00 +0530</pubDate><description>An attendance system that needs a network will be wrong on exactly the days it matters. Queueing punches is easy; the rules that keep the data honest are not.</description><category>field</category><category>site</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Construction sites have poor connectivity by nature. They are basements, they are half-built structures full of steel, they are outside a town, they are behind a hill. Coverage is worst exactly where the work is.</p>
<p>So any attendance system that requires a live network will fail, and it will fail in a specific pattern: it works at the office, it works during the demo, and it produces gaps on the days people were furthest from a tower.</p>
<p>The engineering answer — queue the punches on the device and send them when the network returns — is straightforward. What is not straightforward is keeping the data honest once you have accepted records that were created while nobody was watching.</p>
<h2 id="what-offline-actually-means-for-a-record">What offline actually means for a record<a class="anchor" href="#what-offline-actually-means-for-a-record" aria-label="Link to this section">#</a></h2>
<p>A punch created offline carries three claims: a person, a place, and a time. All three were asserted by a device that was not in contact with anything at the moment of assertion.</p>
<p>That is a genuinely different kind of record from one created against a server, and it needs different rules.</p>
<p><strong>Identity.</strong> The punch must authenticate as the device's own credential, never as an identity supplied in the message. If the payload says who it is from, then anybody who can reach the endpoint can be anybody. Our devices carry their own token, issued once, stored only as a hash, and the punch authenticates as that device rather than as whatever the message claims.</p>
<p><strong>Time.</strong> The device clock is under the user's control. A punch that arrives claiming a time from six hours ago may be a genuine queued punch or a device whose clock was changed. Record both the claimed time and the received time, always, and let a person see the difference where it is large. Silently trusting one or the other is the wrong answer in both directions.</p>
<p><strong>Place.</strong> A punch with no position fix should be refused rather than filed at a default location. We enforce this explicitly: no fix, no punch. The alternative is an attendance record that says somebody was at the point where the equator meets the prime meridian, which is worse than a missing record because it will not look missing.</p>
<h2 id="the-duplicate-that-arrives-twice">The duplicate that arrives twice<a class="anchor" href="#the-duplicate-that-arrives-twice" aria-label="Link to this section">#</a></h2>
<p>A flaky network is not a network that fails. It is a network that succeeds after the client has given up.</p>
<p>So the same punch will be delivered twice, or five times, and the system must fold those into one. This requires the punch to carry an identifier generated on the device at the moment of creation, so that two arrivals of the same event are recognisable as the same event rather than as two events with similar details.</p>
<p>Deduplicating on <em>person plus time</em> is the obvious approach and it is wrong in both directions: it merges two genuinely separate events that happened in the same minute, and it fails to merge one event whose claimed time was recomputed between retries.</p>
<h2 id="permanent-refusal-and-temporary-refusal">Permanent refusal and temporary refusal<a class="anchor" href="#permanent-refusal-and-temporary-refusal" aria-label="Link to this section">#</a></h2>
<p>This is the rule that saves a support burden, and almost nobody builds it in first.</p>
<p>When the server refuses a punch, the phone needs to know which kind of refusal it was:</p>
<ul><li><strong>Try again later.</strong> Server busy, transient failure. Keep it queued.</li><li><strong>Stop retrying this one.</strong> Malformed, duplicate of a settled record, outside any permissible window, from a revoked device.</li></ul>
<p>Without that distinction a permanently invalid punch retries for ever, draining a battery and filling logs. We marked our four payload refusals explicitly as permanent for exactly this reason.</p>
<h2 id="location-is-not-attendance">Location is not attendance<a class="anchor" href="#location-is-not-attendance" aria-label="Link to this section">#</a></h2>
<p>A phone that reports its position in the background is a genuinely useful thing, and it is the fastest way to build something nobody trusts.</p>
<p>The line we drew, and would draw again: <strong>background location is a signal, not an activity.</strong></p>
<p>Concretely, that means a background position sample never counts toward the presence window, never counts as an activity, never decides which site somebody was at for the day, and never on its own grants access to anything. It is recorded, and it is recorded only while the person is punched in — with the server enforcing that, not the app.</p>
<p>The reason is not squeamishness. It is that an attendance figure derived partly from deliberate punches and partly from ambient location is a figure nobody can explain. When somebody disputes a day, you need to be able to say what was recorded and by whom. Mixing an act with an observation destroys that distinction permanently — and the dispute is rarely academic, because these are the numbers a labour contractor's bill is built from, as <a href="https://be-teck.com/blog/paying-a-labour-contractor/">paying a labour contractor</a> sets out.</p>
<p>Two further details that turned out to matter. A device battery level and the kind of position fix are worth storing alongside the sample, because they explain a lot of otherwise inexplicable gaps. And a step count from a phone should be nullable, never zero-by-default — <em>no phone reported</em> and <em>the person did not move</em> are different facts and collapsing them loses the ability to tell a dead battery from a stationary day.</p>
<h2 id="one-law-two-doors">One law, two doors<a class="anchor" href="#one-law-two-doors" aria-label="Link to this section">#</a></h2>
<p>The strongest structural rule we applied: an offline punch from the phone goes through <strong>the same function</strong> as a punch from the web.</p>
<p>Not a similar function. The same one, with a different authentication route into it. Every rule about permissible windows, about sites, about duplicates, about what a punch may and may not do, lives in one place and applies to both.</p>
<p>The temptation to write a separate, simpler path for the device is strong, because the device's needs are different and the shared function has awkward edges. It is the same temptation that produces two implementations of any rule, and the result is always the same: they agree at first and drift, and the drift is silent because each is internally consistent. That is the failure described in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>, arriving from a different direction.</p>
<h2 id="the-kill-switch-has-to-cover-both-doors">The kill switch has to cover both doors<a class="anchor" href="#the-kill-switch-has-to-cover-both-doors" aria-label="Link to this section">#</a></h2>
<p>One more thing, learned by asking the right question at the right moment.</p>
<p>If there is an emergency lock that stops the application, it must stop the device door too. A panic lock that stopped every screen but let phones keep posting locations would not have stopped anything — it would have produced a system that looked locked and was still collecting.</p>
<p>Any capability reachable by a second route needs every control that applies to the first, and it is worth walking every door in a system and asking that question explicitly rather than assuming.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Offline attendance is not a networking problem. It is a trust problem.</p>
<p>Authenticate the device rather than the message. Record claimed time and received time separately. Refuse a punch with no position rather than inventing one. Distinguish permanent refusals from temporary ones. Keep background location as a signal that never becomes an activity.</p>
<p>And send both routes through the same law, because two implementations of one rule is two answers waiting to happen.</p>
<p>The related question of how site staff report anything at all when the network is poor is covered in <a href="https://be-teck.com/blog/whatsapp-is-the-interface/">WhatsApp is the interface</a>.</p>]]></content:encoded></item>
<item><title>The daily progress report nobody reads</title><link>https://be-teck.com/blog/the-daily-progress-report/</link><guid isPermaLink="true">https://be-teck.com/blog/the-daily-progress-report/</guid><pubDate>Tue, 01 Sep 2026 03:00:00 +0530</pubDate><description>Most DPRs are written by somebody who gains nothing from writing them, for somebody who does not read them. There is a version that survives that fact.</description><category>site</category><category>records</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every project has a daily progress report. On most projects it is a form filled in at the end of the day by a site engineer who has been on his feet since seven, describing things he knows and nobody has asked about.</p>
<p>It is filed. It is very rarely read. And when a dispute arises two years later it becomes the most important document on the project, at which point everybody discovers what was actually in it.</p>
<h2 id="the-three-purposes-which-conflict">The three purposes, which conflict<a class="anchor" href="#the-three-purposes-which-conflict" aria-label="Link to this section">#</a></h2>
<p>A DPR is asked to do three jobs, and they pull in different directions.</p>
<p><strong>Management information.</strong> What happened today, so somebody can decide what to do tomorrow. Wants to be short, current and comparative.</p>
<p><strong>A contemporaneous record.</strong> Evidence of what occurred, for claims, disputes, insurance and delay analysis. Wants to be complete, specific and dated, and its value increases with detail.</p>
<p><strong>Compliance.</strong> A form somebody requires. Wants to be filled in.</p>
<p>Design for the first and it is useless in a dispute. Design for the second and nobody will complete it daily for two years. Design for the third and you get a form that satisfies nobody and is completed by copying yesterday's.</p>
<p>Most DPRs are the third, because the third is what survives when the other two have no advocate.</p>
<h2 id="why-the-third-one-wins">Why the third one wins<a class="anchor" href="#why-the-third-one-wins" aria-label="Link to this section">#</a></h2>
<p>The person writing it gets nothing from writing it.</p>
<p>That is the whole mechanism. The site engineer already knows what happened today. The report costs them twenty minutes at the end of a long day and returns them nothing at all. No decision comes back, no question is answered, nobody comments on it. The only feedback they ever receive is when it is missing.</p>
<p>Under those conditions a rational person minimises effort, and the report becomes a slightly modified copy of the previous one. This is not dishonesty. It is what any incentive structure of that shape produces, and it will not be fixed by insisting harder.</p>
<h2 id="the-two-things-that-change-the-outcome">The two things that change the outcome<a class="anchor" href="#the-two-things-that-change-the-outcome" aria-label="Link to this section">#</a></h2>
<p><strong>Make it shorter than it is worth arguing about.</strong> Most DPR forms ask for things that could be derived from other records — material received, attendance, plant hours, weather. If those exist elsewhere in the system, they should be pulled in, not typed again. Re-typing what a machine already knew is the most reliable way to teach somebody a form is not serious.</p>
<p><strong>Give something back.</strong> A report that produces an answer, a decision, or a visible acknowledgement is a report people complete. One that disappears is not. This is the single highest-leverage change available and it costs nothing technical — somebody senior reading it and replying two sentences, most days, is enough.</p>
<h2 id="the-fields-that-matter-in-a-dispute">The fields that matter in a dispute<a class="anchor" href="#the-fields-that-matter-in-a-dispute" aria-label="Link to this section">#</a></h2>
<p>If the second purpose is real — and on any project of size it is — a small number of fields carry almost all the evidential value, and they are not the ones forms usually emphasise.</p>
<ul><li><strong>What was actually done, located.</strong> Not "continued blockwork" but which area, which level, which grid. Unlocated work cannot be tied to a delay later.</li><li><strong>Who was on site</strong>, by trade and number, and whose people they were.</li><li><strong>What stopped, and why, and for how long.</strong> The single most valuable line in any progress record. Waiting for a drawing, waiting for material, waiting for an inspection, rain. Delay claims are built entirely from these and they are the first thing omitted when somebody is in a hurry.</li><li><strong>Instructions received, and from whom.</strong> Verbal instructions become disputes about whether they were given.</li><li><strong>Weather</strong>, recorded honestly rather than as a category.</li><li><strong>Plant on site and whether it was working.</strong></li></ul>
<p>Notice that three of those six are about things <em>not</em> happening. A progress report that can only record progress cannot record the reason there was none, which is exactly the information anybody will want. The wider question of what belongs in writing and what should stay out of it is <a href="https://be-teck.com/blog/what-a-site-engineer-should-record/">what a site engineer should record</a>.</p>
<h2 id="photographs-are-the-report-if-you-let-them">Photographs are the report, if you let them<a class="anchor" href="#photographs-are-the-report-if-you-let-them" aria-label="Link to this section">#</a></h2>
<p>The most complete daily record on most sites is already being produced and is not being kept: the photographs people take.</p>
<p>They are taken constantly, they are located, they are timestamped, and they show what a paragraph cannot. The reason they are not the record is that they are unlabelled, live in a chat, and nothing indexes them.</p>
<p>That is a solvable problem and a much smaller one than getting people to write more. Our own experience is that the photographs were already arriving in volume — over a thousand of them — and had never become anything, because the system was looking for a typed caption and site photographs usually have no caption. The picture already says everything, so nobody types.</p>
<p>The general principle is in <a href="https://be-teck.com/blog/a-site-photograph-is-a-record/">a site photograph is a record, if anything reads it</a>.</p>
<h2 id="ask-do-not-require">Ask, do not require<a class="anchor" href="#ask-do-not-require" aria-label="Link to this section">#</a></h2>
<p>There is a version of daily reporting that works far better than a form, and it is a question.</p>
<p>Once a day, to the people with unfinished work, in the medium they already use, a short list of what is outstanding — with a small number of honest answers available. Done. Moved to tomorrow. Moved to a date. Stuck, and here is why.</p>
<p>Four answers, each running the same action the application itself would run. It takes ten seconds rather than twenty minutes, it produces structured data rather than prose, and the "stuck, and here is why" answer collects the single most valuable field in progress reporting without anybody having to think of it as reporting.</p>
<p>We built ours as an evening list on WhatsApp, capped at a handful of items, respecting leave. The cap matters: a list of thirty things is not a question, it is an accusation, and people stop answering.</p>
<h2 id="do-not-use-it-as-a-performance-record">Do not use it as a performance record<a class="anchor" href="#do-not-use-it-as-a-performance-record" aria-label="Link to this section">#</a></h2>
<p>The fastest way to destroy the honesty of a daily report is to use it to judge the person writing it.</p>
<p>The moment "waiting for material, four hours" becomes evidence in somebody's appraisal, that line stops appearing. What replaces it is a report full of activity and empty of obstruction, which is precisely the report with no evidential value. The same pressure inflates the percentage at the top of a weekly report — <a href="https://be-teck.com/blog/progress-reported-and-progress-real/">reported progress and real progress</a>.</p>
<p>If you want to know where time actually goes, the reporting has to be safe. The same logic applies to escalation, which is why we built ours to surface slipping work without anybody having to name a colleague — <a href="https://be-teck.com/blog/escalation-without-shame/">escalation without shame</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A DPR fails because writing it returns nothing to the person writing it.</p>
<p>Shorten it to what only they know, derive the rest, reply to it so it is visibly read, and capture the photographs that are already being taken.</p>
<p>And make sure it can record the absence of progress, because that is the part somebody will need.</p>]]></content:encoded></item>
<item><title>A site photograph is a record, if anything reads it</title><link>https://be-teck.com/blog/a-site-photograph-is-a-record/</link><guid isPermaLink="true">https://be-teck.com/blog/a-site-photograph-is-a-record/</guid><pubDate>Tue, 01 Sep 2026 02:50:00 +0530</pubDate><description>Thousands of site photographs are taken every month and almost none become records. The bottleneck is not capture. It is that nothing ever looks at them.</description><category>field</category><category>records</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Photographs are the most complete data a construction site produces. They are taken constantly, without being asked for, by everybody, and they contain more than any form would have collected.</p>
<p>They are also, on most projects, worth nothing at all, because nothing reads them.</p>
<h2 id="why-the-photograph-exists-in-the-first-place">Why the photograph exists in the first place<a class="anchor" href="#why-the-photograph-exists-in-the-first-place" aria-label="Link to this section">#</a></h2>
<p>Somebody takes a picture instead of writing because the picture is faster and more complete. A delivery slip photographed contains every field a form would have asked for. A crack photographed says more than three sentences would, and photographed again after the repair it is what closes the item on <a href="https://be-teck.com/blog/the-snag-list-that-closes/">a snag list that actually closes</a>.</p>
<p>That behaviour is not laziness to be corrected. It is a correct assessment of effort against information, made by somebody who is standing up and busy. The question for a system is not how to stop it. It is how to accept it.</p>
<h2 id="the-gap-between-capture-and-record">The gap between capture and record<a class="anchor" href="#the-gap-between-capture-and-record" aria-label="Link to this section">#</a></h2>
<p>We had over a thousand photographs sent from site whose text had been machine read and stored, and nothing had ever looked at the result.</p>
<p>The check that should have used it read only the caption somebody typed. And site photographs usually have no caption, because the delivery slip in the picture already says everything, so nobody types.</p>
<p>The extraction worked. The storage worked. Nothing was broken and nothing had errored. The output simply had no consumer, and a produced result with no consumer looks — from every direction, including from the inside — exactly like a feature that was never built.</p>
<p>This turns out to be one of the commonest classes of defect we find. Work that was done, correctly, and never wired to anything. The general case is <a href="https://be-teck.com/blog/written-and-never-wired/">written, and never wired</a>.</p>
<h2 id="what-a-photograph-needs-to-become-a-record">What a photograph needs to become a record<a class="anchor" href="#what-a-photograph-needs-to-become-a-record" aria-label="Link to this section">#</a></h2>
<p>Four things, and only the first is about the image.</p>
<p><strong>A subject the machine can identify.</strong> A delivery slip, a hazard, a defect, progress, a person, a meter reading. Roughly, is this a document, a condition, or a scene.</p>
<p><strong>A place.</strong> Which site, which area. Usually derivable from who sent it and when, which is much more reliable than asking.</p>
<p><strong>A time.</strong> Almost always present and almost always trusted too readily — a photograph of a photograph, or a picture taken yesterday and sent today, both carry misleading times.</p>
<p><strong>A connection to something.</strong> An order, a task, a location, a person. A photograph attached to nothing is not a record; it is an image in a folder.</p>
<p>The fourth is where nearly all the value sits and where nearly all systems stop.</p>
<h2 id="reading-the-text-is-the-easy-half">Reading the text is the easy half<a class="anchor" href="#reading-the-text-is-the-easy-half" aria-label="Link to this section">#</a></h2>
<p>Extracting text from a photograph of a document is a solved problem to a useful degree of accuracy. Getting from that text to the right record is not.</p>
<p>Our extraction was reading delivery slips correctly and matching them against nothing, because the matcher only considered purchases that had not yet been paid — and in our process, payment precedes dispatch. By the time material arrived and somebody photographed the slip, the correct purchase was always paid and therefore never a candidate. Every slip matched nothing. A slip matched to nothing appears on no screen at all.</p>
<p>The reading was never the bottleneck. The connection was.</p>
<h2 id="three-rules-we-ended-up-with">Three rules we ended up with<a class="anchor" href="#three-rules-we-ended-up-with" aria-label="Link to this section">#</a></h2>
<p><strong>Machine reading produces a suggestion.</strong> Extracted text gets digits wrong, and a document number with a wrong digit is worse than a missing one because it looks usable. Every match is a proposal a person confirms with one tap, and a rejection is remembered so the same wrong pair is never offered again. The argument is in <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<p><strong>Refuse the obvious non-cases rather than guessing.</strong> A cylinder going out for refilling, a vehicle that damaged a divider, a weight dispute — these look superficially like delivery messages. A system that files them as receipts is worse than one that files nothing, because somebody must now find and remove them.</p>
<p><strong>Privacy is enforced before processing, not after.</strong> This one we got wrong. Our text extraction ran <em>before</em> the check that knew which rooms were private, so a personal photograph was being read and, if the text resembled a delivery slip, filed as a goods receipt. The correction was not to discard the result afterwards. It was to exclude private rooms at the query, so the bytes are never fetched at all.</p>
<p>A privacy control that runs after the data has been processed is not a privacy control. It is a cleanup.</p>
<h2 id="not-every-photograph-should-be-quiet-and-not-every-one-should-ring">Not every photograph should be quiet, and not every one should ring<a class="anchor" href="#not-every-photograph-should-be-quiet-and-not-every-one-should-ring" aria-label="Link to this section">#</a></h2>
<p>There is a routing decision hidden in this that took us a while to see.</p>
<p>A contractor's room is correctly kept at arm's length — their progress photographs are their business and notifying our staff about each one would be noise. But a photograph that reads as a <strong>hazard or a defect</strong> is exactly what the channel was added for, and keeping that quiet is a different kind of mistake.</p>
<p>So the rule is by content, not by source: hazard photographs notify, progress photographs do not, regardless of which room they came from.</p>
<p>The general shape of that decision — classify by what the message asks somebody to do, rather than by where it came from or how important it feels — is the subject of <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<h2 id="what-to-do-with-the-archive-you-already-have">What to do with the archive you already have<a class="anchor" href="#what-to-do-with-the-archive-you-already-have" aria-label="Link to this section">#</a></h2>
<p>Most organisations have years of photographs sitting in chat history, in folders named by date, on individual phones.</p>
<p>That archive is worth something, but not much, and it is worth being honest about why: it has no connections. Reprocessing it will give you dated, located images and very few links to orders, tasks or events, because the records those would connect to have moved on.</p>
<p>The better investment is almost always forwards. Get the pipeline right from today — subject, place, time, connection, with a person confirming — and let the archive be what it is, which is a searchable pile that occasionally settles an argument.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Site photographs are already the richest record you have and almost none of them are records, because nothing consumes them.</p>
<p>Reading the image is the easy part. Connecting it to an order, a task or a location is the hard part and the valuable one.</p>
<p>Suggest rather than file. Refuse the obvious non-cases. Enforce privacy before the bytes are fetched. Route by what the picture shows, not by where it came from.</p>
<p>And check, in your own tools, whether anything is actually reading the output of the thing you built to produce it. The answer is surprisingly often no.</p>]]></content:encoded></item>
<item><title>Escalation without shame</title><link>https://be-teck.com/blog/escalation-without-shame/</link><guid isPermaLink="true">https://be-teck.com/blog/escalation-without-shame/</guid><pubDate>Tue, 01 Sep 2026 02:40:00 +0530</pubDate><description>Most escalation systems require somebody to name a colleague. That is why they go unused, and why problems reach management only after they are unfixable.</description><category>site</category><category>notifications</category><category>how-we-work</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every organisation has a process for raising a problem upward. Very few of them are used at the moment they would be useful.</p>
<p>The reason is rarely written down: <strong>escalating means naming somebody.</strong> To report that a task is stuck, you have to say who it is stuck with. To report that material has not arrived, you name the person who was buying it. And the person you are naming will be at lunch with you tomorrow.</p>
<p>So people wait. They wait until the problem is large enough that raising it is clearly justified, which is usually after the point at which it could have been fixed cheaply.</p>
<h2 id="what-the-delay-costs">What the delay costs<a class="anchor" href="#what-the-delay-costs" aria-label="Link to this section">#</a></h2>
<p>Not the escalation itself. The window.</p>
<p>Almost everything on a construction project is fixable if you know about it a week early and expensive if you know about it a week late. A material that has not been ordered can be ordered. A drawing that has not arrived can be chased. An approval that has not moved can be pushed. The same three problems, found after the crew is standing idle, cost their delay plus everything downstream.</p>
<p>An escalation system that reliably fires two weeks late has not reduced the number of problems. It has removed the only period in which they were cheap.</p>
<h2 id="design-so-nobody-has-to-accuse-anybody">Design so nobody has to accuse anybody<a class="anchor" href="#design-so-nobody-has-to-accuse-anybody" aria-label="Link to this section">#</a></h2>
<p>The move that changes behaviour is to make the system, rather than a person, be the one that notices.</p>
<p>Concretely, that means surfacing conditions rather than reports:</p>
<ul><li>Work that has slipped its date more than once.</li><li>A task waiting on the same thing for longer than similar tasks usually wait.</li><li>An approval sitting unactioned past the point where approvals normally move.</li><li>A payment stage past its date.</li><li>A delivery expected and not arrived.</li></ul>
<p>Each of those is computable from data the system already holds. None requires anybody to file a complaint. And because the observation is mechanical, the conversation it produces starts from a fact rather than from an allegation — <em>this has moved twice</em> is a much easier sentence to open with than <em>he keeps missing it</em>.</p>
<p>We built ours this way deliberately: chronically sliding work surfaces itself, so nobody has to snitch. The word is the right one, because that is exactly what people feel they are being asked to do. It matters most at the boundary between two agencies, where the problem belongs to neither of them — <a href="https://be-teck.com/blog/one-project-many-contractors/">one project, many contractors</a>.</p>
<h2 id="predict-rather-than-report">Predict rather than report<a class="anchor" href="#predict-rather-than-report" aria-label="Link to this section">#</a></h2>
<p>The next step is to notice before the date rather than after it.</p>
<p>A late task is a fact. A task <strong>likely to be late</strong> is a warning, and it is the warning that has value, because it arrives while there is still time.</p>
<p>The inputs are unremarkable: how long this kind of work usually takes, how much of the remaining time is left, whether it has been pushed before, whether the person holding it is carrying an unusual load, whether it is waiting on somebody who is on leave. None of this is clever. Most organisations have all of it and use none of it, because nobody has ever been asked to compute a forecast for a task.</p>
<p>Two rules make it usable rather than annoying.</p>
<p><strong>It goes to the person who can act, not to everybody.</strong> A slip-risk warning broadcast widely is a public prediction of somebody's failure, which is exactly the shame problem again, arriving from the other direction.</p>
<p><strong>It says why it thinks so.</strong> A score with no explanation is either believed blindly or ignored entirely, and both are useless. <em>Pushed twice, two days left, usually takes five</em> is actionable. A number out of a hundred is not. The general form of that requirement is <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>
<h2 id="the-scoring-mistake-we-made">The scoring mistake we made<a class="anchor" href="#the-scoring-mistake-we-made" aria-label="Link to this section">#</a></h2>
<p>Our early risk scoring treated every task settled stage-by-stage as <em>money not yet paid</em>, because a staged payment never wrote the field meaning paid. That added a substantial pile of pure noise to a board built to show what actually needs a human.</p>
<p>A warning system that cries wolf gets ignored, and it gets ignored wholesale — people do not learn to discount one category of false positive while remaining alert to the rest. They discount the board.</p>
<p>The underlying fault was the same one that had leaked into eight other places in the application, and it is described in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>. Its relevance here is narrower and worth stating plainly: <strong>the accuracy of an early-warning system is not a quality attribute, it is the entire asset.</strong> A risk board that is right most of the time is not most of a risk board. It is nothing.</p>
<h2 id="ask-the-person-first">Ask the person first<a class="anchor" href="#ask-the-person-first" aria-label="Link to this section">#</a></h2>
<p>Before anything goes upward, the person holding the work should have had a chance to say what is happening, in a form that takes seconds.</p>
<p>A short evening list of what is outstanding, with a small number of honest answers — done, moving to tomorrow, moving to a date, stuck and here is why — resolves most of what would otherwise have escalated, and it does so without anybody being told on.</p>
<p>The fourth answer is the valuable one. <em>Stuck, waiting for the drawing</em> is a complete escalation, filed by the person best placed to file it, without requiring them to make a complaint about anybody. It arrives as an explanation of their own situation rather than as a report about somebody else's.</p>
<p>Cap the list. A list of thirty items is not a question, it is an accusation, and people stop answering. Respect leave, or the first message somebody gets on returning from a funeral will be a demand.</p>
<h2 id="what-escalation-should-look-like-when-it-does-happen">What escalation should look like when it does happen<a class="anchor" href="#what-escalation-should-look-like-when-it-does-happen" aria-label="Link to this section">#</a></h2>
<ul><li><strong>Addressed to somebody specific</strong>, who can act.</li><li><strong>Stating the condition, not a judgement.</strong> What has happened, how long, what it is waiting on.</li><li><strong>Carrying its own history.</strong> How many times, since when, what was tried.</li><li><strong>Closable.</strong> An escalation with no way to say <em>resolved, because this</em> stays open and pollutes the next one.</li></ul>
<p>And it should be quiet by default. An escalation that arrives with alarm attached spends attention that a later, more serious one will need. Attention is a fixed supply, which is the subject of <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>People do not escalate because escalating means naming a colleague.</p>
<p>Let the system notice instead. Compute the conditions rather than requiring reports, warn before the date rather than after it, tell the person who can act and tell them why, and give the person holding the work a two-second way to say they are stuck.</p>
<p>And make sure the warnings are right. An early-warning board that is frequently wrong is not a partly working control. It is an ignored screen. The related question of where the time actually goes is in <a href="https://be-teck.com/blog/why-tasks-stall-between-people/">why tasks stall between people</a>.</p>]]></content:encoded></item>
<item><title>Work slips before it is late</title><link>https://be-teck.com/blog/work-slips-before-it-is-late/</link><guid isPermaLink="true">https://be-teck.com/blog/work-slips-before-it-is-late/</guid><pubDate>Tue, 01 Sep 2026 02:30:00 +0530</pubDate><description>By the time a task is overdue, the decision that made it late was taken weeks earlier. The signals were all present and none of them were being counted.</description><category>site</category><category>how-we-work</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A task becomes late on a particular day, and on that day somebody notices.</p>
<p>The thing that made it late happened much earlier — a date quietly moved, a dependency that never arrived, a person who took on three things in a week when they normally take two. All of those were visible at the time. None of them were counted, because organisations track completion and lateness, and slippage is neither.</p>
<h2 id="lateness-is-a-lagging-indicator">Lateness is a lagging indicator<a class="anchor" href="#lateness-is-a-lagging-indicator" aria-label="Link to this section">#</a></h2>
<p>By definition, a task is late after the point at which anything could have been done about it cheaply.</p>
<p>Everything useful happens in the period before. That period is where a conversation costs five minutes, where material can still be ordered, where an approval can still be chased in time. Once the date has passed, the same problem costs the delay plus the disruption to everything sequenced behind it.</p>
<p>So a board showing what is late is a report on decisions already made. Useful for accountability, useless for prevention.</p>
<h2 id="the-signals-that-precede-a-slip">The signals that precede a slip<a class="anchor" href="#the-signals-that-precede-a-slip" aria-label="Link to this section">#</a></h2>
<p>None of these is subtle. All of them are present in ordinary task data.</p>
<p><strong>The date has moved before.</strong> Overwhelmingly the strongest signal. A task pushed once is a task with a reason; a task pushed twice is a task with a problem. Very few systems count pushes at all, because the field just gets overwritten.</p>
<p><strong>The remaining time is small relative to how long this kind of work usually takes.</strong> Requires knowing the second number, which requires having kept histories.</p>
<p><strong>It has not moved at all since it was created.</strong> A task with no activity is not necessarily stuck, but a task with no activity and an approaching date nearly always is.</p>
<p><strong>It is waiting on somebody who is unavailable.</strong> Leave, travel, or simply carrying an unusual number of open items. This one is computable from the same system that holds the leave calendar and is almost never joined up.</p>
<p><strong>Its dependency has slipped.</strong> Obvious, and requires that dependencies are recorded, which on most projects they are not except in a programme file that nobody updates.</p>
<p><strong>Nobody has asked about it.</strong> Work that people are talking about tends to move. Silence around an item with a near date is a real signal.</p>
<h2 id="counting-pushes-properly">Counting pushes properly<a class="anchor" href="#counting-pushes-properly" aria-label="Link to this section">#</a></h2>
<p>If you do one thing from this piece, count how many times a due date has been changed and by whom.</p>
<p>It is one extra row per change and it converts an invisible pattern into a visible one. It also changes behaviour on its own, mildly and usefully: a date that is known to be counted is moved more thoughtfully.</p>
<p>Two cautions.</p>
<p><strong>Distinguish a push from a reschedule.</strong> A date changed because the whole programme moved is not the same as a date changed because this task did not get done, and lumping them makes the count meaningless.</p>
<p><strong>Do not make the count punitive.</strong> The moment pushing a date becomes a black mark, people stop pushing dates and start letting them pass silently, which is strictly worse — you lose the signal and gain nothing. The same dynamic that governs <a href="https://be-teck.com/blog/escalation-without-shame/">escalation without shame</a> applies here exactly.</p>
<h2 id="say-why-or-the-warning-is-noise">Say why, or the warning is noise<a class="anchor" href="#say-why-or-the-warning-is-noise" aria-label="Link to this section">#</a></h2>
<p>A predicted slip has to arrive with its reasoning attached.</p>
<p><em>This is at risk</em> is a number somebody either believes or dismisses, and after the second wrong one they dismiss all of them. <em>Pushed twice, two days left, similar work usually takes five, waiting on an approval that has been open a week</em> is a sentence somebody can act on, argue with, or dismiss for a good reason.</p>
<p>The requirement generalises well beyond risk scoring, and it has its own piece: <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>
<h2 id="accuracy-is-the-whole-asset">Accuracy is the whole asset<a class="anchor" href="#accuracy-is-the-whole-asset" aria-label="Link to this section">#</a></h2>
<p>Our first version of slip scoring counted every order settled stage-by-stage as <em>money not yet paid</em>, because a staged payment never wrote the field meaning paid. That put a large amount of pure noise onto a board whose entire purpose was to show what needed a human.</p>
<p>The board did not become partly useful. It became ignored — and it was ignored wholesale, because people do not learn to discount one category of false positive while staying alert to everything else on the same screen.</p>
<p>A warning system's precision is not a quality attribute to be improved over time. It is the thing itself. A board that is right most of the time is worth approximately nothing, because the cost of checking a wrong warning is the same as the cost of checking a right one, and after a few weeks nobody checks.</p>
<h2 id="the-stuck-strip">The stuck strip<a class="anchor" href="#the-stuck-strip" aria-label="Link to this section">#</a></h2>
<p>The other half of prediction is description, and it is much simpler.</p>
<p>Every task in our system now carries a plain statement of why it is stuck: what it is waiting for, who it is waiting on, and how long it has been waiting. Not a status code — a sentence.</p>
<p>This does more work than it sounds like. Most of the questions asked in project meetings are that question, asked out loud, one item at a time. Answering it on the item itself removes the meeting's main activity and, more importantly, makes the answer available to the person who could have unblocked it, who was not in the meeting.</p>
<p>It also makes the absence of an answer conspicuous. A task that cannot say what it is waiting for is usually a task nobody has looked at, and that is worth knowing on its own.</p>
<h2 id="what-to-build-first">What to build first<a class="anchor" href="#what-to-build-first" aria-label="Link to this section">#</a></h2>
<p>In order of value for effort:</p>
<ol><li><strong>Count date changes.</strong> One field, enormous signal.</li><li><strong>Put a plain "waiting on what, since when" line on every item.</strong></li><li><strong>Join to the leave calendar</strong>, so work assigned to somebody who is away is visible as such.</li><li><strong>Keep durations</strong>, so "how long does this kind of thing usually take" is answerable at all.</li><li><strong>Only then, score.</strong> A score built on the first four is defensible. A score built on nothing is a random number with a colour.</li></ol>
<p>Most organisations attempt the fifth first, because it is the one that looks like a product. It is the one that requires the other four.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>By the time something is late, the decision that made it late is weeks old.</p>
<p>The signals that precede a slip are ordinary and mostly uncounted — pushed dates above all. Count them, say why when you warn, warn only the person who can act, and never let the warnings be wrong often enough to be dismissed.</p>
<p>And put one honest sentence on every piece of work saying what it is waiting for. It answers, in advance, the question every status meeting exists to ask.</p>]]></content:encoded></item>
<item><title>The voice note is the report</title><link>https://be-teck.com/blog/the-voice-note-is-the-report/</link><guid isPermaLink="true">https://be-teck.com/blog/the-voice-note-is-the-report/</guid><pubDate>Tue, 01 Sep 2026 02:20:00 +0530</pubDate><description>A site engineer sends a voice note because his hands are dusty and the screen is in the sun. For years ours were stored as blobs that nobody ever opened.</description><category>field</category><category>interface</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>On any Indian construction site, a significant share of what gets reported is spoken, not typed.</p>
<p>The reason is not preference. A person outdoors, holding a phone, with dust on their hands and sun on the screen, can hold a button and talk in five seconds. Typing the same content takes a minute and a half and requires reading what they have written, which in that light is genuinely hard.</p>
<p>So voice notes arrive constantly. And in almost every organisation they are stored as an audio file with a label, sitting in a thread, opened by nobody.</p>
<h2 id="the-comment-that-had-known-for-a-year">The comment that had known for a year<a class="anchor" href="#the-comment-that-had-known-for-a-year" aria-label="Link to this section">#</a></h2>
<p>The most uncomfortable part of our own version of this story is that we had written the reason down and then done nothing with it.</p>
<p>A comment in our code said, plainly, that a site engineer sends a voice note because his hands are dusty and the screen is in the sun. It had been there for a long time. The voice notes went on being a labelled blob nobody read.</p>
<p>That gap — between understanding a thing and having built for it — is a specific and common failure. It is not ignorance. It is that the understanding lived in a comment, which agrees with itself for ever and stops nothing. The same observation, made about a styling rule, is in <a href="https://be-teck.com/blog/capitals-are-a-contrast/">capitals are a contrast, not a volume</a>: a rule written as prose survives exactly as long as the memory of the argument that produced it.</p>
<h2 id="transcription-is-the-easy-half">Transcription is the easy half<a class="anchor" href="#transcription-is-the-easy-half" aria-label="Link to this section">#</a></h2>
<p>Turning recorded speech into text is a solved problem to a workable standard, including for Hindi and for the mixture of Hindi and English that people actually speak.</p>
<p>Doing it is not the interesting part. What happens to the words afterwards is.</p>
<p>The wrong answer — and it is the answer most implementations reach — is to put the transcript in the thread and stop. Now there is text nobody reads instead of audio nobody plays. The reporting problem is untouched.</p>
<h2 id="same-words-same-doors">Same words, same doors<a class="anchor" href="#same-words-same-doors" aria-label="Link to this section">#</a></h2>
<p>The rule we settled on is that a transcribed voice note takes <strong>the normal door</strong>.</p>
<p>A spoken incident report classifies and registers exactly as a typed one would. A spoken answer to the evening list of outstanding work is treated as that answer. A spoken question gets an answer grounded in the records, the same answer a typed question would get. A spoken report from a contractor becomes the same kind of card a written one becomes.</p>
<p>Not a similar path. The same two dispatch functions a typed message goes through, called with the transcribed text.</p>
<p>This is a construction constraint rather than a preference. A parallel path for spoken input would be a second implementation of every classification rule, every permission check and every routing decision in the system. Two implementations of one rule agree at first and then drift, and the drift is silent because each is internally consistent. That failure mode is described in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<h2 id="what-to-do-with-audio-that-cannot-be-read">What to do with audio that cannot be read<a class="anchor" href="#what-to-do-with-audio-that-cannot-be-read" aria-label="Link to this section">#</a></h2>
<p>Some recordings are unusable. Wind, machinery, a pocket recording, thirty seconds of a conversation with no subject.</p>
<p>The correct outcome is not to retry for ever and not to fail silently. It is to mark the item as <strong>tried and empty</strong> and leave the queue. That state is different from <em>not yet processed</em> and different from <em>failed, try again</em>, and collapsing the three produces either an endless retry loop or a queue that looks clean while quietly discarding things.</p>
<p>This is the same distinction that matters for offline attendance punches, where a phone must know the difference between <em>try again later</em> and <em>stop retrying this one</em>. It is in <a href="https://be-teck.com/blog/attendance-without-signal/">attendance on a site with no signal</a>.</p>
<h2 id="where-the-transcription-should-run">Where the transcription should run<a class="anchor" href="#where-the-transcription-should-run" aria-label="Link to this section">#</a></h2>
<p>We run ours on our own hardware, with the same model the rest of the estate uses, and voice is treated as first in the queue because a person is waiting for the result.</p>
<p>Two reasons for keeping it local, and only one of them is about cost.</p>
<p>The first is privacy. A voice note from a site contains names, rates, complaints about people, and occasionally something personal that was sent to the wrong thread. Sending all of that to an external service is a decision somebody should make deliberately rather than by default.</p>
<p>The second is that it removes a dependency on a third party for a function people come to rely on daily. A transcription service that is unavailable makes the whole reporting channel feel broken, and site staff who try something twice and get nothing do not try a third time.</p>
<h2 id="the-privacy-boundary-comes-first">The privacy boundary comes first<a class="anchor" href="#the-privacy-boundary-comes-first" aria-label="Link to this section">#</a></h2>
<p>One rule we had to learn by getting it wrong on the image side, and it applies identically here.</p>
<p>Processing must happen <strong>after</strong> the check that decides what may be processed, not before. Our text extraction on photographs once ran ahead of the gate that knew which rooms were private, so a personal picture was read and, if its content resembled a delivery document, filed as a goods receipt.</p>
<p>The fix was not to discard the output. It was to exclude private material at the query, so the bytes are never fetched at all. A control that runs after processing is a cleanup, not a control.</p>
<p>For voice this matters more, because speech in a private thread is more likely to be personal than a photograph in one, and a transcript is far easier to read by accident than an audio file is to listen to.</p>
<h2 id="what-it-changes-on-site">What it changes on site<a class="anchor" href="#what-it-changes-on-site" aria-label="Link to this section">#</a></h2>
<p>Nothing, which is the point.</p>
<p>The person on site does what they were already doing. The report they were already making becomes a record. Nobody is asked to learn a form, to log in, or to change a habit that exists because of dust and sunlight. What that record has to carry, and what should stay out of it, is <a href="https://be-teck.com/blog/what-a-site-engineer-should-record/">what a site engineer should record</a>.</p>
<p>That is the general principle behind all of this work and it is worth stating plainly: when the field has settled on a behaviour, the software's job is to read that behaviour, not to replace it. The wider argument is in <a href="https://be-teck.com/blog/whatsapp-is-the-interface/">WhatsApp is the interface, whether you designed for it or not</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Voice notes are how sites report, for reasons of dust and sunlight rather than preference.</p>
<p>Transcribing them is the easy half. Making the words take exactly the same path a typed message takes is the half that matters, because a parallel path is a second copy of every rule you have.</p>
<p>Mark unreadable audio as tried and empty rather than retrying for ever, run the transcription where the privacy decision is yours to make, and check that the privacy gate runs before the processing rather than after it.</p>]]></content:encoded></item>
<item><title>Who is allowed to decide what</title><link>https://be-teck.com/blog/who-is-allowed-to-decide/</link><guid isPermaLink="true">https://be-teck.com/blog/who-is-allowed-to-decide/</guid><pubDate>Tue, 01 Sep 2026 02:10:00 +0530</pubDate><description>Most permission systems answer "what may this person see". The harder question is what they may decide, and organisations usually cannot state their own answer.</description><category>site</category><category>principles</category><category>records</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Ask an organisation who is allowed to approve a payment and you will get an answer. Ask who is allowed to cancel a goods receipt, revise an order total, release retention, export the vendor list, or write off a balance, and the answers get vaguer, then contradictory, then absent.</p>
<p>That vagueness is not a documentation problem. It is a design problem, and it surfaces as software behaviour that nobody intended.</p>
<h2 id="seeing-is-not-deciding">Seeing is not deciding<a class="anchor" href="#seeing-is-not-deciding" aria-label="Link to this section">#</a></h2>
<p>The commonest structural mistake is to treat visibility and authority as one scale, so that anybody senior enough to see something is by construction allowed to change it.</p>
<p>They are different axes. A site engineer may need to see every payment on their project and should not be able to authorise one. An accountant may need to adjust stock valuations without being able to see who is on leave. A super administrator may see everything and still should not be able to move money alone, for reasons in <a href="https://be-teck.com/blog/two-signatures-on-money/">why one person should never move the company's money</a>.</p>
<p>Collapsing the two produces a system where the only way to give somebody information is to give them power, and the practical result is that people are either over-privileged or blind.</p>
<h2 id="the-permission-checks-that-are-actually-wrong">The permission checks that are actually wrong<a class="anchor" href="#the-permission-checks-that-are-actually-wrong" aria-label="Link to this section">#</a></h2>
<p>Three specific faults we found in our own system, each of which is common enough to be worth checking for in yours.</p>
<p><strong>A check that asks the wrong question.</strong> The function that reversed a stock entry asked only whether the caller was an administrator — and, separately, allowed anybody whose name appeared on a row to cancel that row. Neither is the rule anybody would have written down if asked. Both were the rule for as long as nobody asked.</p>
<p><strong>A check that reads the wrong field.</strong> We introduced a category of account that must be refused certain things, and implemented the test as a comparison against the account's primary role. That comparison misses any account carrying a second role, because the role field holds only the primary hat. The correct implementation was a property of the account in its own right, not a value of a field that happens to usually contain it.</p>
<p>That is a general trap. Any check written as <em>role equals X</em> is fragile the moment a person can hold two roles, and people always end up holding two roles.</p>
<p><strong>A check that leaks through a second door.</strong> Our stock reversal could reach through the store's interface and cancel an entry that the gate had written — leaving the gate's own register saying the lorry arrived and the entry impossible to restore. The permission on the store door was correct. There was a second door.</p>
<p>The lesson from the third is procedural rather than technical: <strong>enumerate the doors</strong>. Every way into a piece of data, including the ones added later for a different purpose, and check each one against the same rule. A capability reachable by two routes needs every control that applies to the first route.</p>
<h2 id="errors-that-answer-questions">Errors that answer questions<a class="anchor" href="#errors-that-answer-questions" aria-label="Link to this section">#</a></h2>
<p>A subtle one, worth its own paragraph because it is easy to build by accident.</p>
<p>If a system responds differently to <em>that record does not exist</em> and <em>that record exists but is not yours</em>, then anybody can determine which records exist by guessing at identifiers and reading the difference in the responses. We had exactly this: a card could be filed onto any task in the company, signed with the filer's name, on a task they could not see — and its two different errors answered <em>does task X exist?</em> for anything anybody cared to guess.</p>
<p>The same refusal, either way. It feels unhelpful and it is the correct behaviour.</p>
<h2 id="grant-do-not-assume">Grant, do not assume<a class="anchor" href="#grant-do-not-assume" aria-label="Link to this section">#</a></h2>
<p>The most useful change we made in this area was to stop treating capabilities as implied by seniority and start treating them as granted keys.</p>
<p>Exporting data and importing data are the clearest examples. Both are powerful — an export takes information out of the building and an import writes over things — and both had historically been available to whoever happened to be senior enough to find the screen.</p>
<p>They are now explicit grants: held implicitly by the few people at the top, and given to anybody else person by person, on a panel where you can see the whole list and take one back.</p>
<p>Two properties make that work. The list must be <strong>visible in one place</strong>, so somebody can look at it and be surprised. And a grant must be <strong>revocable in one action</strong>, because a permission you cannot easily withdraw is one people are reluctant to give, and reluctance produces workarounds.</p>
<h2 id="delegation-is-a-permission-with-a-clock">Delegation is a permission with a clock<a class="anchor" href="#delegation-is-a-permission-with-a-clock" aria-label="Link to this section">#</a></h2>
<p>People travel. Work must continue. So authority gets handed over, and the handover is where most permission designs quietly fail.</p>
<p>The version that holds:</p>
<ul><li><strong>Bounded in time</strong>, with an end date.</li><li><strong>Revocable by either party</strong> at any point.</li><li><strong>Never granted to somebody who already holds the counterpart authority</strong>, enforced by the system rather than by the good sense of whoever sets it up.</li><li><strong>Visible on the record</strong>, so the audit trail says <em>on behalf of</em> rather than silently recording the stand-in as the decider.</li><li><strong>Excluding the exceptional powers.</strong> An emergency override stays with its original holder; a stand-in gets the ordinary authority.</li></ul>
<p>Without the last two you have a system where, after the fact, nobody can tell who actually decided something — which defeats the purpose of recording decisions at all. What that record has to contain is set out in <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>.</p>
<h2 id="the-question-to-ask-about-every-action">The question to ask about every action<a class="anchor" href="#the-question-to-ask-about-every-action" aria-label="Link to this section">#</a></h2>
<p>For each thing a person can do in your system, four questions:</p>
<ol><li><strong>Who may do this?</strong> Stated as a rule, not as a list of names.</li><li><strong>Is it reachable by more than one route?</strong> If so, does every route check?</li><li><strong>What does it leave behind?</strong> An action that changes something and records nothing cannot be governed at all.</li><li><strong>Can it be undone, and by whom?</strong> Frequently the undo is more powerful than the action, and is guarded less.</li></ol>
<p>The fourth is the one people miss. Cancelling a receipt is a bigger capability than creating one, because creating a wrong receipt is visible and reversing a correct one is not. Put to somebody else's system rather than your own, the same enquiry takes the shape of <a href="https://be-teck.com/blog/approval-chains-worth-asking-about/">approval chains worth asking about</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Visibility and authority are different axes, and merging them forces you to choose between over-privileged people and blind ones.</p>
<p>Check the right property rather than the primary role. Enumerate every door into a capability, not just the one it was built behind. Give the same refusal whether a record is missing or forbidden. Make powerful capabilities explicit grants that one screen can show and one action can withdraw.</p>
<p>And when authority is delegated, bound it, record it as delegated, and never let one person end up holding both halves of a rule that exists to require two.</p>]]></content:encoded></item>
<item><title>What an audit trail is actually for</title><link>https://be-teck.com/blog/what-an-audit-trail-is-for/</link><guid isPermaLink="true">https://be-teck.com/blog/what-an-audit-trail-is-for/</guid><pubDate>Tue, 01 Sep 2026 02:00:00 +0530</pubDate><description>Not catching thieves. An audit trail exists so that a decision made a year ago can be reconstructed, including by the person who made it and now has to defend it.</description><category>records</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Most people, asked what an audit trail is for, will say something about accountability or catching wrongdoing.</p>
<p>That is a small part of it, and it is the part that makes audit trails unpopular with the people who have to work under them. The larger and more useful purpose is reconstruction: being able to say, later, what the state of the world was at a particular moment and what somebody knew when they acted.</p>
<p>Framed that way, the audit trail protects the person who made the decision at least as much as it protects the organisation.</p>
<h2 id="the-question-it-exists-to-answer">The question it exists to answer<a class="anchor" href="#the-question-it-exists-to-answer" aria-label="Link to this section">#</a></h2>
<p>Not <em>who did this</em>. The much harder question is:</p>
<blockquote><p>Why was this reasonable at the time?</p></blockquote>
<p>A decision made a year ago was made on information available a year ago. If your records only hold the current state, then every past decision is judged against facts that arrived afterwards, and every past decision looks worse than it was.</p>
<p>An audit trail that captures the state at the time of the decision — what the order said, what had been received, what the balance was, which version of the document was signed — makes the reconstruction possible. Without it, defending a correct decision is a matter of memory and confidence.</p>
<h2 id="what-has-to-be-in-an-entry">What has to be in an entry<a class="anchor" href="#what-has-to-be-in-an-entry" aria-label="Link to this section">#</a></h2>
<p>Five things, and the fourth is the one usually missing.</p>
<p><strong>Who.</strong> Including, where relevant, on whose behalf. A delegated action recorded under the stand-in's name loses the fact of delegation permanently.</p>
<p><strong>When.</strong> Server time, not client time. A client clock is under somebody's control.</p>
<p><strong>What changed.</strong> Both sides — the value before and the value after. A trail that records only the new value cannot answer the most common question, which is what it used to be.</p>
<p><strong>Why.</strong> A reason, where one is required. This is the field that turns a log into a record, and it is the one systems skip because it needs a human.</p>
<p><strong>On what basis.</strong> Which version of the document, which rule, which computation. A payment approved against a total that has since been revised needs to record the total it was approved against.</p>
<h2 id="the-reason-that-never-arrived">The reason that never arrived<a class="anchor" href="#the-reason-that-never-arrived" aria-label="Link to this section">#</a></h2>
<p>A concrete failure from our own system, because it shows how easily the fourth field is lost.</p>
<p>Reversing a stock entry required a reason, and the interface asked for one. The reason never reached the audit trail — because the trail reads the reason from the record's <em>new state</em>, and no reason was ever handed to it.</p>
<p>So every cancellation would have been recorded as having happened for no stated reason. The prompt was there, the person typed an answer, and the answer went nowhere.</p>
<p>Nothing errored. The trail was full of properly formed entries, each complete except for the only field anybody would ever want. This is the ordinary shape of audit-trail defects: they do not look like failures, they look like records.</p>
<h2 id="append-only-or-it-is-not-a-trail">Append-only, or it is not a trail<a class="anchor" href="#append-only-or-it-is-not-a-trail" aria-label="Link to this section">#</a></h2>
<p>An audit trail that can be edited is a document, not a trail.</p>
<p>This is not a matter of degree. If the entries can be revised, then the trail tells you what somebody most recently wanted it to say, which is precisely the thing you were trying to avoid depending on.</p>
<p>The practical form is that entries are only ever added. A mistake in the trail is corrected by a new entry describing the correction, not by fixing the old one. The full argument, including why this is also better for ordinary day-to-day questions, is in <a href="https://be-teck.com/blog/append-only-records/">append-only records</a>.</p>
<p>Ours is a hash chain, which means each entry incorporates a fingerprint of the one before it. The practical consequence is that no entry can be inserted, removed or altered without breaking every entry after it — including by somebody with database access. It also means a hand-written entry is impossible, which is a constraint we ran into and then decided to keep.</p>
<h2 id="what-it-must-not-become">What it must not become<a class="anchor" href="#what-it-must-not-become" aria-label="Link to this section">#</a></h2>
<p>Three failure modes turn an audit trail into an expense with no benefit.</p>
<p><strong>A log of everything.</strong> If every read, every page view and every keystroke is recorded, the trail is enormous and the decisions are buried. Record the decisions and the changes, not the traffic.</p>
<p><strong>A trail nobody can read.</strong> A table of field names and identifiers is technically complete and practically useless. If answering an ordinary question requires an engineer, then the trail is not available to the people who need it, and its existence is theoretical.</p>
<p><strong>A trail that is only consulted in disputes.</strong> A record read once a year is a record nobody notices is broken. Ours had a missing reason field for a long time precisely because nothing routinely depended on it.</p>
<p>The remedy for the third is to make the trail part of ordinary use. If the history of an order is visible on the order — who did what, when, why — then people read it weekly, and defects in it get noticed by users rather than by auditors. If you are buying rather than building, that is also the thing to make a vendor show you — <a href="https://be-teck.com/blog/ask-to-see-the-audit-trail/">ask to see the audit trail before you sign</a>.</p>
<h2 id="it-protects-the-approver">It protects the approver<a class="anchor" href="#it-protects-the-approver" aria-label="Link to this section">#</a></h2>
<p>Worth stating separately, because it changes how people feel about being recorded.</p>
<p>Somebody who approved a payment correctly, on the information available, should be able to demonstrate that in two years. Somebody who signed a document should be able to show which version they signed. Somebody who accepted a delivery should be able to show what they recorded on the day.</p>
<p>Without a trail, all of those people are relying on their own recollection and on the goodwill of whoever is asking. With one, they have evidence — and what that evidence has to consist of when a department or an auditor asks years later is <a href="https://be-teck.com/blog/the-paper-trail-a-query-demands/">the paper trail a query demands</a>.</p>
<p>That is a large part of why people are willing to sign things at all, and it is worth saying out loud when a trail is introduced — because the alternative framing, that the system is watching them, is both available and corrosive.</p>
<h2 id="the-related-question-of-the-document-itself">The related question of the document itself<a class="anchor" href="#the-related-question-of-the-document-itself" aria-label="Link to this section">#</a></h2>
<p>An audit trail records what happened to a record. It does not, by itself, prove that a document is the document that was signed.</p>
<p>That is a different mechanism — <a href="https://be-teck.com/blog/tamper-evident-documents/">tamper-evident documents</a> — and the two are complementary. The trail says a signature was applied at a time by a person. The document's own fingerprint says this is the thing that was signed.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>An audit trail exists so that a past decision can be reconstructed, including by the person defending it.</p>
<p>Record who, when, what changed on both sides, why, and against which version. Make it append-only, or it records only the most recent intention. Keep it small enough to be readable and visible enough to be read routinely.</p>
<p>And check, in your own system, that the reason field actually arrives. Ours did not, for a long time, and every entry looked perfectly fine.</p>]]></content:encoded></item>
<item><title>Append-only: why a correction should never overwrite</title><link>https://be-teck.com/blog/append-only-records/</link><guid isPermaLink="true">https://be-teck.com/blog/append-only-records/</guid><pubDate>Tue, 01 Sep 2026 01:50:00 +0530</pubDate><description>A record that can be edited answers only today's question. Adding a correcting entry instead costs one row and keeps the history that makes the number defensible.</description><category>records</category><category>principles</category><category>accounts</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>There are two ways to correct a wrong number in a system.</p>
<p>You can change it. Or you can add a new entry that says the old one was wrong, by how much, and why.</p>
<p>The first is simpler, produces a tidier screen, and destroys the ability to answer almost every question anybody will later ask. The second costs one extra row.</p>
<h2 id="what-an-edit-actually-removes">What an edit actually removes<a class="anchor" href="#what-an-edit-actually-removes" aria-label="Link to this section">#</a></h2>
<p>When a stored value is overwritten, three things go with it.</p>
<p><strong>What it used to be.</strong> Obvious, and the least important.</p>
<p><strong>That it ever changed.</strong> This is the real loss. A value that was corrected looks identical to a value that was right the first time, so the <em>fact of the correction</em> — which is often the interesting event — leaves no trace.</p>
<p><strong>Everything that was decided while the old value was in place.</strong> Somebody approved a payment against a total. Somebody ordered material against a quantity. Those decisions were reasonable given what was on the screen, and after an edit there is no way to show what was on the screen.</p>
<p>The third is why this is a governance matter and not a database preference. An edited record makes past decisions indefensible, including correct ones.</p>
<h2 id="the-shape-of-an-append-only-correction">The shape of an append-only correction<a class="anchor" href="#the-shape-of-an-append-only-correction" aria-label="Link to this section">#</a></h2>
<p>Do not change the entry. Write another one.</p>
<p>For a stock entry: the original marked cancelled, and a reversing entry of the opposite sign. For a payment: a reversal and a fresh entry. For a quantity: an adjustment with its own date and reason.</p>
<p>There is a detail in the stock version worth borrowing generally. Our reversal writes two halves in one movement: the original marked cancelled, and a reversing correction of the opposite sign <strong>which is itself born already cancelled</strong>.</p>
<p>That shape is deliberate. A reader that filters out cancelled rows sees neither half. A reader that forgets to filter sees both, and both add to zero. The answer is correct under either reading — which is what you want when you cannot personally audit every piece of code that will ever count your stock.</p>
<p>It is also keyed so that a second reversal of the same entry is impossible, which closes the obvious way to turn a correction into a hole.</p>
<h2 id="the-objection-and-the-answer">The objection, and the answer<a class="anchor" href="#the-objection-and-the-answer" aria-label="Link to this section">#</a></h2>
<p>The objection is always the same: the screen gets cluttered. Nobody wants to look at a list of transactions where half the rows are cancelled.</p>
<p>The answer is that presentation and storage are different problems. The default view can show the net position and nothing else. What matters is that the history exists underneath it and can be reached by anybody who needs it, without an engineer.</p>
<p>An append-only ledger with a clean default view is strictly better than a mutable one. An append-only ledger with no view at all is worse, which is why the presentation work is not optional and is usually where these projects fail.</p>
<h2 id="where-the-discipline-has-to-hold">Where the discipline has to hold<a class="anchor" href="#where-the-discipline-has-to-hold" aria-label="Link to this section">#</a></h2>
<p><strong>Financial records</strong>, obviously.</p>
<p><strong>Stock movements</strong>, because a physical balance is the sum of its history and an edited history produces a balance that cannot be explained.</p>
<p><strong>Anything with a reason attached.</strong> A write-off, a deduction, a rejection. The reason is the record — the amount is arithmetic anybody could recompute. We refused, deliberately, to allow a payment schedule containing written-off stages to be deleted, because deleting it would take with it every recorded reason for every write-off on it, and those reasons are the only surviving answer to who decided that money would never come.</p>
<p><strong>Approvals and signatures.</strong> These attach to a state of the world; if the state can be changed afterwards, the approval means nothing.</p>
<p><strong>The audit trail itself</strong>, absolutely and without exception — which is really the same statement, since the trail is the append-only record of everything else.</p>
<h2 id="the-trail-that-cannot-be-written-by-hand">The trail that cannot be written by hand<a class="anchor" href="#the-trail-that-cannot-be-written-by-hand" aria-label="Link to this section">#</a></h2>
<p>Ours is a hash chain: each entry incorporates a fingerprint of the one before it. Alter, insert or remove an entry and every entry after it stops verifying.</p>
<p>There is a consequence of that which we did not anticipate and have decided to keep. <strong>No audit row can be written by hand.</strong> Not by a developer with database access, not by an administrator fixing something, not by a migration script. The chain either was produced by the application's own recording path or it does not verify.</p>
<p>That is inconvenient about twice a year. It is also the property that makes the trail worth anything, because a trail that a sufficiently senior person can adjust is a trail that says whatever that person wants it to say.</p>
<h2 id="derived-values-are-the-exception-and-must-be-computed">Derived values are the exception, and must be computed<a class="anchor" href="#derived-values-are-the-exception-and-must-be-computed" aria-label="Link to this section">#</a></h2>
<p>Append-only applies to facts. It does not apply to conclusions drawn from them.</p>
<p>A running balance, a total, a status — these should be <strong>computed from the entries</strong>, not stored and maintained. A stored derived value is a second copy of a fact, and second copies drift.</p>
<p>We learned this expensively. A payment total, a paid flag and a schedule of stages all described the same money, and the flag was never written by the staged path. Nine separate places in the application asked the flag rather than the schedule, each written by somebody who reasonably assumed it meant what it looked like it meant. The account is <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<p>So: entries are appended and never edited; conclusions are computed and never stored. Where a stored conclusion is unavoidable for performance, exactly one piece of code should own it, and everything else should ask that code.</p>
<h2 id="what-it-costs">What it costs<a class="anchor" href="#what-it-costs" aria-label="Link to this section">#</a></h2>
<p>Storage, which is free. A little more work at presentation time, which is real. And a genuine discipline problem: somebody will always want to make a bad row disappear, and the honest answer is that they cannot, only that they can correct it visibly.</p>
<p>One further cost is easy to defer and expensive to discover: a history is only yours if it survives the day you leave the system, and most exports carry the current values and none of the corrections — <a href="https://be-teck.com/blog/getting-your-data-back-out/">getting your data back out</a>.</p>
<p>That last one is the whole point and the reason it needs to be a rule rather than a preference. A system where the right people can quietly erase things is a system whose records are worth what those people's memories are worth.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Correct by adding, never by overwriting.</p>
<p>Write reversals in a shape that reads correctly whether or not the reader filters out cancelled rows. Keep reasons, and refuse to delete anything that carries them. Compute totals rather than storing them. And make the audit trail structurally impossible to write by hand.</p>
<p>Then show a clean view on top of all of it, because a history nobody can read is a history nobody will maintain. What that history has to contain is set out in <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>.</p>]]></content:encoded></item>
<item><title>Tamper-evident, not tamper-proof</title><link>https://be-teck.com/blog/tamper-evident-documents/</link><guid isPermaLink="true">https://be-teck.com/blog/tamper-evident-documents/</guid><pubDate>Tue, 01 Sep 2026 01:40:00 +0530</pubDate><description>You cannot stop somebody altering a copy of a document. You can make any alteration detectable, and that is a much more useful property than it sounds.</description><category>records</category><category>principles</category><category>design</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A signed document leaves your building as a file. Somebody can open it, change a figure, and print it.</p>
<p>There is no way to prevent that. Once a copy exists outside your control, it is theirs to modify. The useful goal is not prevention — it is <strong>detection</strong>: making it so that any alteration can be demonstrated, by anybody, without having to trust the person holding the copy.</p>
<p>That distinction is worth being precise about, because "tamper-proof" is the word people reach for and it promises something no system delivers.</p>
<h2 id="what-tamper-evidence-actually-requires">What tamper-evidence actually requires<a class="anchor" href="#what-tamper-evidence-actually-requires" aria-label="Link to this section">#</a></h2>
<p>Three things, and each one has an obvious wrong implementation.</p>
<p><strong>A fingerprint of the exact bytes.</strong> A cryptographic hash of the finished document. Change one character and the fingerprint changes completely. This is the mechanism, and it only works if the fingerprint is of the <em>final</em> document — including every signature mark, every stamp, every appended page.</p>
<p><strong>A way to check that fingerprint against a copy you did not produce.</strong> A number printed on the page is useless unless a person holding the paper can verify it against something authoritative. In practice that means a URL, and a QR code so the URL can be reached from a printed page without typing.</p>
<p><strong>A record on your side that says what the fingerprint should be.</strong> Kept append-only, because a fingerprint register somebody can edit is a register that certifies whatever the last editor wanted.</p>
<h2 id="where-the-marks-go-and-why-the-order-matters">Where the marks go, and why the order matters<a class="anchor" href="#where-the-marks-go-and-why-the-order-matters" aria-label="Link to this section">#</a></h2>
<p>There is an ordering constraint here that is easy to get wrong and hard to recover from.</p>
<p>Signature marks have to be drawn <strong>first</strong>, and the whole document sealed and fingerprinted <strong>afterwards</strong>. Sealing first and then adding signatures produces a fingerprint of a document that no longer exists.</p>
<p>Stated like that it sounds obvious. It is not obvious when the signing feature and the sealing feature are built at different times by different people, and the natural order of implementation is the reverse of the correct one.</p>
<p>The same applies to every page. Fingerprinting only the last page — the one with the signature on it — leaves every other page of the document unprotected, which is a substantial gap on any document longer than one sheet. A work order whose last page is provably genuine and whose middle pages can be replaced is not tamper-evident in any useful sense.</p>
<h2 id="the-strip-at-the-foot-of-every-page">The strip at the foot of every page<a class="anchor" href="#the-strip-at-the-foot-of-every-page" aria-label="Link to this section">#</a></h2>
<p>The practical implementation we settled on puts a reserved strip at the bottom of every page carrying four things: the document number, <em>page N of M</em>, the fingerprint, and a QR code that reaches the verification page.</p>
<p>Each of those four is doing a specific job.</p>
<p><strong>The document number</strong> identifies which document this claims to be.</p>
<p><strong>Page N of M</strong> is what makes page removal detectable. Without it, deleting a page from the middle produces a shorter document that is otherwise entirely plausible.</p>
<p><strong>The fingerprint</strong> is the check itself.</p>
<p><strong>The QR code</strong> is what makes the check available to somebody holding paper, which is the only situation in which any of this matters. A verification mechanism that requires the verifier to already be inside your system verifies nothing for the people who need it.</p>
<p>The strip is <strong>reserved</strong>, visibly, at the point where somebody chooses where a signature goes, and again on the server when the document is produced. A signature laid over that strip would hide the four things that would have to be forged together, and a rule enforced only in the interface is a rule that applies until somebody uses a different route.</p>
<h2 id="sealed-means-sealed">Sealed means sealed<a class="anchor" href="#sealed-means-sealed" aria-label="Link to this section">#</a></h2>
<p>Once a document is signed and sealed, it cannot be overwritten from the editor it came from. Editing hands you a <strong>copy</strong>, and the original that the verification page vouches for stays byte-for-byte what it was.</p>
<p>This is the part users push back on, and the pushback is reasonable — they want to fix a typo. The answer has to be no, and the reason has to be explained rather than enforced silently: a document whose contents can change after signature is a document whose signature means nothing, including the signatures that were applied in good faith.</p>
<p>Giving them a copy immediately, in one action, removes most of the friction. Refusing without offering the copy is how a control gets routed around.</p>
<h2 id="the-awkward-details-that-decide-whether-it-works">The awkward details that decide whether it works<a class="anchor" href="#the-awkward-details-that-decide-whether-it-works" aria-label="Link to this section">#</a></h2>
<p><strong>Rotated pages.</strong> A page carrying a rotation instruction is rendered one way by the tool that displays it and another way by the library that writes marks onto it. If those two disagree, a signature placed in the right place on screen lands somewhere else in the file. Our picker refuses a placement on a rotated page rather than guessing, because a signature in the wrong place on a legal document is worse than a refusal.</p>
<p><strong>Which page each mark is on.</strong> The accompanying record page states where every signature was placed, so somebody holding the last sheet can still find the middle one.</p>
<p><strong>The verification page itself.</strong> It has to say what it checked and what the answer means, in plain words. <em>This document matches the record</em> and <em>this document does not match the record, here is what we hold</em> are both useful. A green tick with no explanation teaches people nothing and is trusted for the wrong reasons.</p>
<h2 id="what-it-does-not-do">What it does not do<a class="anchor" href="#what-it-does-not-do" aria-label="Link to this section">#</a></h2>
<p>Tamper-evidence proves that a document is byte-for-byte what was signed. It does not prove the contents were true, that the signatory understood them, or that the signatory was who they said they were. Those are separate questions with separate mechanisms, and conflating them is how people end up over-relying on a technical control. What a signature applied on a phone does and does not prove is one of them — <a href="https://be-teck.com/blog/signing-from-a-phone/">signing a document from a phone</a>.</p>
<p>It pairs with, rather than replaces, a record of what happened — <a href="https://be-teck.com/blog/what-an-audit-trail-is-for/">what an audit trail is for</a>. The trail says a signature was applied at a time by a person. The fingerprint says this is the thing that was signed. You need both.</p>
<p>And both depend on the underlying records being <a href="https://be-teck.com/blog/append-only-records/">append-only</a>, because a fingerprint register that can be revised certifies nothing at all.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>You cannot stop somebody editing a copy. You can make the edit provable.</p>
<p>Fingerprint the final bytes, after the marks are drawn, on every page not just the signed one. Print the document number, the page count, the fingerprint and a QR code where a person holding paper can use them. Reserve that space properly, on the server as well as in the interface.</p>
<p>Refuse to overwrite a sealed document, and hand over a copy in the same breath so the refusal does not become an obstacle worth defeating.</p>]]></content:encoded></item>
<item><title>The machine proposes, a person decides</title><link>https://be-teck.com/blog/the-machine-proposes/</link><guid isPermaLink="true">https://be-teck.com/blog/the-machine-proposes/</guid><pubDate>Tue, 01 Sep 2026 01:30:00 +0530</pubDate><description>An automatic link that turns out wrong is not just an error. It is an error that looks like a record, and nobody reading it later can tell nothing was agreed.</description><category>principles</category><category>how-we-work</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The rule is short, and in our own work it came from the owner of the business rather than from anybody building the software: <strong>never auto-link anything.</strong></p>
<p>A machine may look at a bank transaction and conclude it paid a particular invoice. It may look at a photograph of a delivery slip and conclude it belongs to a particular order. It may look at two tasks and conclude they are the same piece of work.</p>
<p>In every case the conclusion is recorded as a <strong>suggestion</strong>. A person taps to confirm or to reject. Only the tap makes it a link. Merging two records that appear to name the same buyer is the same act with more at stake, because it also settles whose enquiry it is — <a href="https://be-teck.com/blog/one-buyer-three-enquiries/">one buyer, three enquiries</a>.</p>
<h2 id="why-given-that-the-machine-is-usually-right">Why, given that the machine is usually right<a class="anchor" href="#why-given-that-the-machine-is-usually-right" aria-label="Link to this section">#</a></h2>
<p>The objection is reasonable. If the match is correct nine times out of ten, insisting on a tap costs nine unnecessary actions to prevent one error.</p>
<p>The answer is that the cost of the tenth is not what it appears to be.</p>
<p>An automatic link produces a record that is <strong>indistinguishable from a human decision</strong>. Six months later somebody reads <em>this transaction paid that invoice</em> and has no way of knowing that nobody ever agreed. They act on it. They reconcile against it. They tell a vendor something based on it.</p>
<p>The error is not the wrong pairing. The error is the false confidence in the record afterwards, and that confidence is unbounded — it propagates into every decision downstream, and none of those decisions carry a marker saying they rested on a guess.</p>
<p>A wrong suggestion, by contrast, is refused in two seconds and leaves nothing behind.</p>
<h2 id="asymmetry-not-caution">Asymmetry, not caution<a class="anchor" href="#asymmetry-not-caution" aria-label="Link to this section">#</a></h2>
<p>This is not a general position that machines should be distrusted. It is a specific observation about asymmetric costs.</p>
<p>The cost of asking is small, bounded, and paid immediately by somebody who has the context. The cost of a wrong automatic action is unbounded, paid later, by somebody who does not.</p>
<p>Whenever costs are shaped like that, the answer is to ask. Where they are not — where a wrong action is cheap and easily reversed, and asking is expensive — automate freely. Sorting, ranking, filtering, drafting, extracting, summarising are all fine. It is <em>asserting a fact into the record</em> that requires a person.</p>
<h2 id="what-we-had-to-undo">What we had to undo<a class="anchor" href="#what-we-had-to-undo" aria-label="Link to this section">#</a></h2>
<p>When we adopted the rule, some links had already been created automatically by the machine's own authority.</p>
<p>We converted them back into suggestions, in the same migration that introduced the rule.</p>
<p>There was no honest alternative. A record created by a mechanism you have since decided is not trustworthy does not become trustworthy by being a few weeks old. Leaving them would have meant a permanent stratum of records that looked like decisions and were not, with no way to tell them apart afterwards.</p>
<p>That is an uncomfortable amount of work to take on for a principle, and it is the part that tells you whether the principle is real.</p>
<h2 id="what-a-good-suggestion-looks-like">What a good suggestion looks like<a class="anchor" href="#what-a-good-suggestion-looks-like" aria-label="Link to this section">#</a></h2>
<p>Six properties, learned mostly by getting them wrong.</p>
<p><strong>It carries its reasoning.</strong> Not a score — a sentence. <em>Exact amount, vendor name in the narration</em> is something a person can agree or disagree with. A number out of a hundred is something they either believe or ignore. The general argument is <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>
<p><strong>It meets an evidence floor.</strong> A weak guess is worse than no suggestion, because reviewing it costs the same as reviewing a good one. We found that a near-miss amount alone was being treated as evidence, and it is not — it is an absence of contradiction. It now needs corroboration beside it. The mechanics are in <a href="https://be-teck.com/blog/matching-a-bank-line/">matching a bank line</a>.</p>
<p><strong>The same floor applies everywhere.</strong> We had a second surface offering the same kind of pairing, written separately, with its own lower threshold. So a match the main matcher would have refused was available as a one-tap action somewhere else. One rule, one implementation, asked by every screen.</p>
<p><strong>Both answers are permanent.</strong> A rejection is remembered, so the same wrong pair is never proposed again. A suggestion system that forgets its rejections re-asks the same question weekly and is muted within a month.</p>
<p><strong>It is reachable.</strong> Ours were not, for a while — the suggestions were being hidden by the very filter meant to rank them, and a related action existed as code with no button anywhere in the application. Built is not the same as reachable, which is its own piece: <a href="https://be-teck.com/blog/written-and-never-wired/">written, and never wired</a>.</p>
<p><strong>Undo is complete.</strong> Undoing an attachment must also close the open question it answered, or a stale card keeps rendering on a record the money never belonged to.</p>
<h2 id="where-the-line-falls">Where the line falls<a class="anchor" href="#where-the-line-falls" aria-label="Link to this section">#</a></h2>
<p>It is worth being concrete, because "propose, do not act" can be read as paralysis.</p>
<p><strong>Machine acts freely:</strong> ranking a queue, extracting text from an image, transcribing speech, drafting a message, computing a total, flagging an anomaly, sorting by risk, filling a form field the person can see and change before submitting.</p>
<p><strong>Machine proposes only:</strong> creating a link between two records, attaching money to an order, marking something paid, closing a task, sending a message to a person outside the company, changing a permission, writing to an audit trail on somebody's behalf.</p>
<p>The test is simple. If the action produces something a future reader would interpret as a decision, a person has to have made it.</p>
<h2 id="it-is-also-better-for-the-machine">It is also better for the machine<a class="anchor" href="#it-is-also-better-for-the-machine" aria-label="Link to this section">#</a></h2>
<p>An unexpected benefit: confirmations and rejections are training data.</p>
<p>A system that acts alone learns nothing, because it never finds out whether it was right. A system that proposes accumulates, with every tap, a labelled judgement from somebody who knew the answer. Ours uses confirmed matches to learn vendor labels, which improves later suggestions.</p>
<p>Asking is not the price of safety here. It is the mechanism by which the thing gets better.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Never let a machine assert a fact into the record on its own authority.</p>
<p>Not because machines are unreliable, but because an automatic error is indistinguishable from a decision, and it will be trusted by people who cannot know it was never made.</p>
<p>Propose, with reasoning, above an evidence floor, from one implementation, remembering both answers, with a complete undo.</p>
<p>Then a wrong guess costs two seconds instead of a year.</p>]]></content:encoded></item>
<item><title>The app should tell you why</title><link>https://be-teck.com/blog/the-app-should-tell-you-why/</link><guid isPermaLink="true">https://be-teck.com/blog/the-app-should-tell-you-why/</guid><pubDate>Tue, 01 Sep 2026 01:20:00 +0530</pubDate><description>A refusal with no reason, an empty screen with no cause, a score with no basis. Each teaches that the software is arbitrary, and arbitrary things get routed around.</description><category>interface</category><category>principles</category><category>gaps</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>There is a category of software behaviour that is technically correct and practically useless: the system does the right thing and does not say why.</p>
<p>A page refuses access. A list is empty. A field will not accept a value. A number appears with a colour. In each case the software knows the reason exactly, and in each case it has chosen not to share it.</p>
<p>The cost is not confusion in the moment. It is that people learn the system is arbitrary, and arbitrary systems get worked around.</p>
<h2 id="the-four-places-it-happens">The four places it happens<a class="anchor" href="#the-four-places-it-happens" aria-label="Link to this section">#</a></h2>
<p><strong>A refusal.</strong> Somebody is not allowed to do something. The screen says so and stops. We had a refusal that landed people on a blank form with no indication of why they had got there. They had done nothing wrong and there was nothing for them to do differently; they simply learned that the thing sometimes does not work.</p>
<p><strong>An empty state.</strong> A list with nothing in it looks identical whether it is empty because there is nothing to show, empty because a filter is excluding everything, empty because the data has not loaded, or empty because something upstream is broken. Four completely different situations with one appearance. A layer that is switched on and holding nothing should say so rather than looking indistinguishable from one that was never switched on.</p>
<p><strong>A computed judgement.</strong> A risk score, a suggested match, a flag. Without its basis, the number is either believed blindly or ignored entirely. Neither is use.</p>
<p><strong>A thing that happened by itself.</strong> A calendar entry that appeared, a message that was sent, a task that moved. If the system does something on a person's behalf and does not say what caused it, the person's reasonable conclusion is that the software is unpredictable.</p>
<p>None of the four appears in a sales demonstration unless somebody asks to see one, which is why <a href="https://be-teck.com/blog/how-to-run-a-software-demo/">how to run a software demo</a> is largely a list of things to insist on.</p>
<h2 id="why-it-goes-missing">Why it goes missing<a class="anchor" href="#why-it-goes-missing" aria-label="Link to this section">#</a></h2>
<p>Not because anybody decided against it.</p>
<p>The reason exists at the point of the decision, deep in some function that knows exactly which condition failed. Then the result travels outward as a boolean — allowed or not, matched or not, valid or not — and by the time it reaches the screen the reason has been thrown away several layers earlier.</p>
<p>Recovering it is not a design task, it is a plumbing task, and plumbing tasks lose to features in every prioritisation meeting ever held. That is the actual mechanism, and knowing it is useful because it tells you where to fix it: the reason has to be carried, not reconstructed at the end.</p>
<h2 id="what-a-good-why-contains">What a good "why" contains<a class="anchor" href="#what-a-good-why-contains" aria-label="Link to this section">#</a></h2>
<p>Three parts, and most implementations stop after the first.</p>
<p><strong>What happened.</strong> <em>This is refused.</em></p>
<p><strong>Why, specifically.</strong> Not a category. The actual condition: <em>because this order is closed</em>, <em>because your account does not hold the export key</em>, <em>because the material has not been received against this payment</em>.</p>
<p><strong>What to do about it.</strong> The part that turns an explanation into help. Who to ask, which button, what has to happen first. A refusal that names the person who can grant the thing removes an entire support conversation.</p>
<p>We rewrote a set of failure notices in our own system that had all three parts wrong. When a message failed to send, the notice told people to create an approved template in a service we had retired months earlier — so it was sending people to fix a problem that could not exist. Its sibling was worse: when a handset stopped answering, the notice said messages were being routed via the other provider. There is no other provider. They were not being sent at all.</p>
<p>Both now describe the system that is actually running and name the real cause — the handset needs re-pairing, the secret no longer matches, nothing is answering, or the service was too busy to reply — each with the one action that fixes it.</p>
<h2 id="explanations-in-the-readers-language">Explanations in the reader's language<a class="anchor" href="#explanations-in-the-readers-language" aria-label="Link to this section">#</a></h2>
<p>An explanation in a language the reader does not use is not an explanation.</p>
<p>This matters more than it sounds on an Indian construction site, where the person receiving a refusal may read Hindi and not English, or may read neither comfortably. Our approach is one plain line in the reader's own language, with the original text kept beside it rather than replaced — because the original is what somebody technical will need if the plain line turns out to be wrong.</p>
<p>And the register matters as much as the language. In Hindi, the respectful form throughout, never bare imperatives. A system that instructs people curtly in their own language is worse than one that does it in a foreign one, because the rudeness lands.</p>
<h2 id="explaining-without-being-noisy">Explaining without being noisy<a class="anchor" href="#explaining-without-being-noisy" aria-label="Link to this section">#</a></h2>
<p>The obvious objection is that explanations clutter the screen, and it is a fair one.</p>
<p>Three rules keep it manageable.</p>
<p><strong>Explain the unexpected, not the ordinary.</strong> A successful save needs no justification. A refusal always does.</p>
<p><strong>Put the reason where the effect is</strong>, not in a separate log or a tooltip nobody hovers. If a payment is held, the reason belongs on the payment.</p>
<p><strong>Keep it to one sentence in the interface, with the detail one tap away.</strong> Most people need to know why; a few need to know precisely why.</p>
<h2 id="the-pin-that-explains-itself">The pin that explains itself<a class="anchor" href="#the-pin-that-explains-itself" aria-label="Link to this section">#</a></h2>
<p>A small example we are fond of, because it shows the idea working at a scale where it clearly costs nothing.</p>
<p>A public portal existed with no explanation of what it was for, so it looked arbitrary to anybody who came across it. Adding one line — what this is and why it exists — turned an unexplained thing into an understood one, permanently, for the price of a sentence.</p>
<p>Almost every "why" in a system is that cheap. The expensive part is noticing which questions people are silently asking.</p>
<h2 id="where-it-connects">Where it connects<a class="anchor" href="#where-it-connects" aria-label="Link to this section">#</a></h2>
<p>An unexplained judgement is the failure mode of every predictive feature. A slip warning without its basis is a number people stop reading, which is why <a href="https://be-teck.com/blog/work-slips-before-it-is-late/">work slips before it is late</a> insists on the sentence rather than the score.</p>
<p>An unexplained proposal is the failure mode of every suggestion system, which is why every match in our own tools carries its reasoning — <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<p>And an unexplained routing decision is how a signature request ends up delivered as chatter, in <a href="https://be-teck.com/blog/filed-as-chatter/">filed as chatter</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The system always knows why. It just discards the reason on the way out.</p>
<p>Carry it. Say what happened, why specifically, and what to do next. Say it where the effect is, in the reader's language, in a respectful register, once.</p>
<p>An unexplained refusal is not a small usability flaw. It is the thing that teaches people the software is arbitrary, and everything they do after learning that is a workaround.</p>]]></content:encoded></item>
<item><title>A default is a decision somebody made once</title><link>https://be-teck.com/blog/defaults-are-decisions/</link><guid isPermaLink="true">https://be-teck.com/blog/defaults-are-decisions/</guid><pubDate>Tue, 01 Sep 2026 01:10:00 +0530</pubDate><description>Defaults are set in the abstract, by somebody not thinking about your case, and then apply for years without ever looking like a choice again.</description><category>design</category><category>principles</category><category>notifications</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every configurable system has defaults, and every default is a decision.</p>
<p>It was made once, early, in the abstract, by somebody who was not thinking about the specific case it would eventually govern. It then applies to everything that falls into its category, for years, without being revisited — because nothing about it ever looks like a choice again. It looks like the way things are.</p>
<p>That property is what makes defaults the most under-examined part of any system.</p>
<h2 id="how-a-default-stops-looking-like-a-decision">How a default stops looking like a decision<a class="anchor" href="#how-a-default-stops-looking-like-a-decision" aria-label="Link to this section">#</a></h2>
<p>At the moment it is set, everybody involved knows it is a judgement call. There is often a discussion. Somebody says <em>we can change it later</em>.</p>
<p>Then time passes. The people who set it move on. New behaviour is built on top of it and inherits it. New cases are classified into the category it governs, by people who are thinking about the classification and not about what the classification implies.</p>
<p>And the default becomes invisible, in a specific way: it is not that people disagree with it, it is that they no longer see it. When something goes wrong, nobody looks there, because it does not present as a place where a decision lives.</p>
<h2 id="what-it-looked-like-for-us">What it looked like for us<a class="anchor" href="#what-it-looked-like-for-us" aria-label="Link to this section">#</a></h2>
<p>A document was sent for signature. It sat there. The person who had to sign did not know they had to sign it.</p>
<p>The request went out carrying a generic type — <em>question</em> — and types are mapped onto rows in a routing grid. <em>Question</em> had been mapped, sensibly enough, onto the row for comments. And the comment row's default delivery is a bulletin: held back until the next scheduled broadcast, ringing nothing, arriving as one line among a dozen others that also did not need doing right now.</p>
<p>So a document that was holding up a payment was delivered as chatter.</p>
<p>Every component in that chain did its job. The request was raised correctly. It was classified into a real category. That category was routed by a rule somebody had written down on purpose. Nothing failed. The design had simply never been asked what a signature request <em>is</em>, so it answered a different question and answered it well. The full account is <a href="https://be-teck.com/blog/filed-as-chatter/">filed as chatter</a>.</p>
<h2 id="the-blanket-rule-and-what-it-hides">The blanket rule and what it hides<a class="anchor" href="#the-blanket-rule-and-what-it-hides" aria-label="Link to this section">#</a></h2>
<p>The second thing defaults do is more subtle and, in our experience, more dangerous: <strong>a blanket rule hides which places were depending on it.</strong></p>
<p>We had a single line of styling that put the entire application into capital letters. It was doing what was asked. It was also, inevitably, capitalising things nobody had meant to capitalise — names, comments, error messages.</p>
<p>When we came to remove it, we found that 129 of the application's 138 table header cells carried no case rule of their own. For as long as the blanket existed they never needed one. So simply deleting the blanket would have quietly un-capitalised every column heading in the application — which the newly written rule says <em>should</em> be capitalised.</p>
<p>Every place that stopped declaring its own intention because a blanket was covering it becomes invisible, and stays invisible right up until the blanket comes off. Removing a default is a <strong>survey, not a deletion</strong>, and the survey is the whole job. That story is <a href="https://be-teck.com/blog/capitals-are-a-contrast/">capitals are a contrast, not a volume</a>.</p>
<h2 id="defaults-that-are-actively-harmful">Defaults that are actively harmful<a class="anchor" href="#defaults-that-are-actively-harmful" aria-label="Link to this section">#</a></h2>
<p>Some default choices are worse than others in a way worth naming.</p>
<p><strong>A default that fails silently.</strong> Anything where the wrong outcome produces no error. A message delivered quietly rather than loudly. A field defaulting to zero rather than to unknown — we made a phone's step count nullable rather than zero precisely because <em>no phone reported</em> and <em>the person did not move</em> are different facts.</p>
<p><strong>A default that is correct for the common case and catastrophic for the rare one.</strong> These are the hardest, because the default is right and the exception is what needs attention. A notification tier that is correct for comments and disastrous for signature requests is exactly this shape.</p>
<p><strong>A default set for a system that no longer exists.</strong> Configuration outlives architecture. We had failure notices instructing people to fix things in a service we had retired months earlier, and they had been sending people to solve an impossible problem ever since.</p>
<h2 id="quiet-is-a-feature">Quiet is a feature<a class="anchor" href="#quiet-is-a-feature" aria-label="Link to this section">#</a></h2>
<p>An important corollary, because the reflex when a default is found to be wrong is to make everything louder.</p>
<p>Loudness is a resource with a fixed supply. An application that rings for everything is an application people mute, and a muted application delivers nothing at all. The bulletin tier in our own system is doing real work for the messages that genuinely belong to it — the mistake was never that quiet delivery exists, it was that a signature request had been classified into it.</p>
<p>So the fix is not escalation. It is to stop lying about what the message wants. Once a request says <em>this asks somebody to act</em>, the routing follows on its own and nobody has to argue about priority. That reasoning is in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>
<h2 id="how-to-audit-your-own">How to audit your own<a class="anchor" href="#how-to-audit-your-own" aria-label="Link to this section">#</a></h2>
<p>Four questions, applied to any default worth the time.</p>
<ol><li><strong>When was this set, and by whom, and for what case?</strong> If nobody knows, that is itself the finding.</li><li><strong>What is now classified into this category that was not when it was set?</strong> The category grew. The default did not.</li><li><strong>What happens when it is wrong?</strong> A default whose failure is loud is much safer than one whose failure is silence.</li><li><strong>What would break if it were removed?</strong> Not what would change — what would break. That question is the survey, and the answer is usually longer than expected.</li></ol>
<p>The fourth is the one people skip, and it is the one that costs the regression.</p>
<p>The same four are worth asking of a system you are about to buy, where the defaults are somebody else's and you inherit every one of them — <a href="https://be-teck.com/blog/choosing-construction-software/">how to choose construction software</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A default is a decision made once, in the abstract, that then applies for years without ever looking like a decision again.</p>
<p>The dangerous ones are the ones that are right for the common case, silent when wrong, and covering places that stopped declaring their own intention because the default was covering them.</p>
<p>Removing one is a survey. And when a default turns out to be wrong, the answer is usually to fix the classification rather than to turn up the volume.</p>]]></content:encoded></item>
<item><title>Offline-first is a data decision, not a network one</title><link>https://be-teck.com/blog/offline-first-is-a-data-decision/</link><guid isPermaLink="true">https://be-teck.com/blog/offline-first-is-a-data-decision/</guid><pubDate>Tue, 01 Sep 2026 01:00:00 +0530</pubDate><description>Queueing requests is the easy part. Offline changes what a record means, because it was created by a device nobody was watching, at a time nobody can verify.</description><category>field</category><category>principles</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>"Make it work offline" is usually heard as a networking requirement: queue the requests, retry when the connection returns, show a spinner in between.</p>
<p>That part is straightforward and it is not where the difficulty is. The difficulty is that a record created offline is a <strong>different kind of record</strong>, and every rule that governed the online version has to be re-examined against it.</p>
<h2 id="what-changes-about-a-record">What changes about a record<a class="anchor" href="#what-changes-about-a-record" aria-label="Link to this section">#</a></h2>
<p>An entry created against a server was created in a conversation. The server saw the request, applied its rules, and the result was known immediately to both sides.</p>
<p>An entry created offline is an assertion made by a device, in isolation, about a moment nobody else observed, delivered later. Three things about it are now claims rather than facts:</p>
<p><strong>Time.</strong> The device clock is under the user's control.</p>
<p><strong>Sequence.</strong> Two devices offline at once will produce events whose true order nobody recorded.</p>
<p><strong>Validity.</strong> The rules were not applied when the entry was made. They will be applied when it arrives, which may be after the situation it referred to has changed.</p>
<p>None of these has a general solution. Each has to be decided for the specific record.</p>
<h2 id="decide-time-explicitly">Decide time explicitly<a class="anchor" href="#decide-time-explicitly" aria-label="Link to this section">#</a></h2>
<p>The commonest mistake is to store one timestamp and never say which one it is.</p>
<p>Store both: <strong>the time the device claims</strong> and <strong>the time the server received it</strong>. They are different facts, and the gap between them is informative — a large gap is ordinarily a queued punch and occasionally an altered clock.</p>
<p>Then decide, per record type, which one governs. An attendance punch should almost certainly use the claimed time, because the whole point is when the person was there. A financial entry should almost certainly use the server time, because the ordering of money matters more than the device's opinion. What must not happen is that the decision is made implicitly by whichever field somebody selected.</p>
<h2 id="decide-the-rules-that-cannot-be-checked-offline">Decide the rules that cannot be checked offline<a class="anchor" href="#decide-the-rules-that-cannot-be-checked-offline" aria-label="Link to this section">#</a></h2>
<p>Some rules can be applied on the device: this field is required, this number must be positive, this date must be in the past.</p>
<p>Others cannot, because they depend on state the device does not hold: is this person still employed, is this site still active, has somebody else already recorded this, is the order still open.</p>
<p>The offline design has to answer, in advance, what happens when an entry passes the device's checks and fails the server's. There are only three honest answers: accept it anyway with a flag, reject it and tell the person, or hold it for somebody to resolve. All three are defensible. Not choosing means the behaviour is decided by an error handler somebody wrote in a hurry.</p>
<p>Related, and vital: the device must be able to tell <strong>try again later</strong> from <strong>stop retrying this one</strong>. Without that distinction a permanently invalid entry retries for ever, draining a battery and filling logs. We marked our payload refusals explicitly as permanent for exactly this reason. The detail is in <a href="https://be-teck.com/blog/attendance-without-signal/">attendance on a site with no signal</a>.</p>
<h2 id="deduplicate-on-an-identifier-not-on-content">Deduplicate on an identifier, not on content<a class="anchor" href="#deduplicate-on-an-identifier-not-on-content" aria-label="Link to this section">#</a></h2>
<p>A poor network is not one that fails. It is one that succeeds after the client has given up, so the same entry arrives two or five times.</p>
<p>Fold them by an identifier generated <strong>on the device at the moment of creation</strong>, carried with every retry. Deduplicating on content — same person, same time, same amount — is wrong in both directions: it merges two genuinely separate events that look alike, and it fails to merge one event whose details were recomputed between attempts.</p>
<h2 id="authenticate-the-device-never-the-message">Authenticate the device, never the message<a class="anchor" href="#authenticate-the-device-never-the-message" aria-label="Link to this section">#</a></h2>
<p>If the payload says who it is from, then anybody who can reach the endpoint can be anybody.</p>
<p>Our devices carry their own credential, issued once during an ordinary sign-in inside the app, shown once and stored only as a hash. A queued entry authenticates as that device, and the identity is derived from the credential rather than read from the message.</p>
<p>Two consequences worth planning for. A credential can be revoked, and revocation has to reach the queue — entries already queued on a revoked device should not be honoured simply because they were created before it was revoked. And the emergency stop has to cover this door too: a lock that stopped every screen while phones went on posting would not have stopped anything.</p>
<h2 id="one-law-two-doors">One law, two doors<a class="anchor" href="#one-law-two-doors" aria-label="Link to this section">#</a></h2>
<p>The strongest structural rule, and the one most often broken: an offline entry must go through <strong>the same function</strong> as an online one.</p>
<p>Not a similar function written for the device's convenience. The same one, with a different authentication route into it.</p>
<p>The temptation to write a separate, simpler path is strong, because the device's needs are different and the shared function has awkward edges. It is the same temptation that produces two implementations of any rule, and the result is always the same — they agree at first, they drift, and the drift is silent because each is internally consistent. That is the failure described in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<h2 id="signals-are-not-activities">Signals are not activities<a class="anchor" href="#signals-are-not-activities" aria-label="Link to this section">#</a></h2>
<p>A phone that is offline can still observe things — position, movement, battery. It is tempting to let those observations count toward whatever the record is measuring.</p>
<p>We drew a hard line: a background position sample is a <strong>signal, not an activity</strong>. It never counts toward the presence window, never counts as activity, never decides which site somebody was at, and never grants access to anything. It is recorded only while the person is deliberately punched in, and the server enforces that rather than the app.</p>
<p>The reason is that a figure derived partly from deliberate acts and partly from ambient observation is a figure nobody can explain. When somebody disputes it, you need to be able to say what was recorded and by whom.</p>
<h2 id="test-the-ugly-cases-because-they-are-the-common-ones">Test the ugly cases, because they are the common ones<a class="anchor" href="#test-the-ugly-cases-because-they-are-the-common-ones" aria-label="Link to this section">#</a></h2>
<p>The demo path — go offline, make an entry, come back, see it sync — always works, which is why <a href="https://be-teck.com/blog/evaluating-offline-claims/">how to test a works-offline claim in ten minutes</a> is a cheap phone in flight mode rather than a meeting. The ones that matter:</p>
<ul><li>Entry made offline, and the underlying thing changes before it syncs.</li><li>Two devices offline making conflicting entries about the same object.</li><li>Device offline for a week.</li><li>Device clock wrong by hours.</li><li>Sync interrupted halfway.</li><li>Credential revoked while entries are queued.</li><li>Same entry delivered five times.</li></ul>
<p>Each of these is ordinary in the field and absent from every test plan written at a desk. The general point — that the test is the worst day, not the demo — is in <a href="https://be-teck.com/blog/how-we-find-our-own-problems/">how we find our own problems</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Offline is not about the network. It is about what a record means when it was created by a device nobody was watching.</p>
<p>Store claimed and received time separately and decide which governs. Say in advance what happens when server rules reject an entry the device accepted. Deduplicate on an identifier created at source. Authenticate the device, not the message. Keep observations distinct from acts.</p>
<p>And send both routes through one function, because two implementations of a rule is two answers waiting to disagree.</p>]]></content:encoded></item>
<item><title>Name it what the site already calls it</title><link>https://be-teck.com/blog/the-words-the-site-already-uses/</link><guid isPermaLink="true">https://be-teck.com/blog/the-words-the-site-already-uses/</guid><pubDate>Tue, 01 Sep 2026 00:50:00 +0530</pubDate><description>Our software recognised a delivery photo only if the caption said one of four words. Against four hundred real captions, those four words matched exactly two.</description><category>interface</category><category>field</category><category>design</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Software written in an office uses office vocabulary. The people using it on a site use site vocabulary. Where the two meet, the software's version wins, because the software is the thing that refuses.</p>
<p>That is a small problem for a form label and a large one for anything that has to recognise what somebody wrote.</p>
<h2 id="four-words-that-matched-two-captions">Four words that matched two captions<a class="anchor" href="#four-words-that-matched-two-captions" aria-label="Link to this section">#</a></h2>
<p>Our system recognised a photograph from site as a delivery record only if its caption contained one of four words: challan, bilty, GRN, delivery.</p>
<p>Those are the correct words. They are what the document is called. They appear in the purchase manual, in the training material and on the form.</p>
<p>Measured against four hundred real captions the site team had actually sent, those four words matched <strong>two</strong>.</p>
<p>What people really write is the material, a quantity and a unit — a concrete grade with a volume and a weight. Or the vehicle: a supplier's mixer has arrived. Or a plain numbered list: a trader's name, then two lines each with a quantity and a unit.</p>
<p>Nobody was refusing to use the official word. They were describing what had happened, in the way a person describes something to a colleague, which is the only way anybody writes when they are not filling in a form.</p>
<p>Reading those three shapes instead — the material named directly, the vehicle that brought it, or any quantity with a unit — took the match rate from two to thirty-four out of the same four hundred captions. Nothing about the site changed.</p>
<h2 id="why-the-official-word-is-never-the-used-word">Why the official word is never the used word<a class="anchor" href="#why-the-official-word-is-never-the-used-word" aria-label="Link to this section">#</a></h2>
<p>Three reasons, and none of them is carelessness.</p>
<p><strong>The official word is a category; the used word is the specific thing.</strong> Nobody says "a delivery has arrived". They say what arrived.</p>
<p><strong>The used word is shorter.</strong> Effort matters enormously when your hands are dirty.</p>
<p><strong>The used word is often not in the interface language.</strong> A person typing on a site in India may write in Hindi, in Devanagari or in Roman letters, or mix both in one sentence. A vocabulary list that contains only English words has excluded a large fraction of the input before it starts, and what a supplier's promise of Hindi support usually turns out to mean is examined in <a href="https://be-teck.com/blog/software-your-staff-can-read/">software your staff can actually read</a>.</p>
<h2 id="where-vocabulary-decides-behaviour">Where vocabulary decides behaviour<a class="anchor" href="#where-vocabulary-decides-behaviour" aria-label="Link to this section">#</a></h2>
<p>It is worth separating the places where this matters from the places where it does not.</p>
<p><strong>Labels on a form.</strong> Matters a little. People adapt.</p>
<p><strong>Search.</strong> Matters a lot. Somebody searching for a material by the name the site uses, in a system that stores the purchasing name, finds nothing and concludes the record does not exist.</p>
<p><strong>Recognition of free text.</strong> Matters completely. This is the case above, and it is the difference between a feature working and a feature that has never once fired.</p>
<p><strong>Error messages and refusals.</strong> Matters completely, and in a different way — a message in a vocabulary the reader does not have is not a message. That is part of <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>
<h2 id="how-to-find-the-real-vocabulary">How to find the real vocabulary<a class="anchor" href="#how-to-find-the-real-vocabulary" aria-label="Link to this section">#</a></h2>
<p>Not by asking. If you ask people what words they use, they will tell you the official ones, because a question about vocabulary sounds like a test.</p>
<p>Read what they have already written. Every organisation has a large corpus of real language sitting in its message history, its site diaries, its comment fields and its photograph captions. Take a few hundred, read them, and count.</p>
<p>Two rules make this useful rather than merely interesting.</p>
<p><strong>Measure against real examples, not against intuition.</strong> Our four words felt comprehensive. Counting them against four hundred captions is what produced the number two, and no amount of discussion would have.</p>
<p><strong>Keep counting afterwards.</strong> Vocabulary drifts, new materials arrive, staff change. A recognition rule that was measured once, three years ago, is a rule whose accuracy is now unknown.</p>
<h2 id="broadening-without-becoming-wrong">Broadening without becoming wrong<a class="anchor" href="#broadening-without-becoming-wrong" aria-label="Link to this section">#</a></h2>
<p>The obvious risk in accepting more vocabulary is accepting the wrong things.</p>
<p>Our matcher still refuses what is plainly not a receipt: a cylinder going out for refilling, a truck that damaged a divider, a weight dispute. Each of those contains a material, a quantity and a vehicle, and each would be caught by a naive broadening.</p>
<p>Two things make the broadening safe.</p>
<p><strong>Explicit exclusions, drawn from the same corpus.</strong> The non-cases are in the message history too, and they are the more valuable half of the reading exercise, because they are what tells you where the boundary is.</p>
<p><strong>Everything is a suggestion.</strong> A match is proposed and confirmed with one tap, never filed automatically. That converts the cost of over-matching from a wrong record into two seconds of somebody's attention — which is what makes it possible to be generous with recognition at all. The argument is in <a href="https://be-teck.com/blog/the-machine-proposes/">the machine proposes, a person decides</a>.</p>
<h2 id="respect-is-part-of-the-vocabulary">Respect is part of the vocabulary<a class="anchor" href="#respect-is-part-of-the-vocabulary" aria-label="Link to this section">#</a></h2>
<p>One more dimension, easy to miss if you only think about matching.</p>
<p>In Hindi, the difference between the respectful form and the bare imperative is not stylistic. A system that tells people what to do in the familiar imperative reads as rude, consistently, to everybody who receives it — and it is being read by people who are already the least powerful users in the organisation.</p>
<p>Our rule is the respectful form everywhere, without exception. It costs nothing and its absence is felt every single time.</p>
<h2 id="what-this-is-really-about">What this is really about<a class="anchor" href="#what-this-is-really-about" aria-label="Link to this section">#</a></h2>
<p>The general principle is one we keep arriving at from different directions: when the field has settled on a behaviour, the software's job is to read that behaviour rather than to replace it.</p>
<p>People photograph slips because a photograph is faster than a form. People send voice notes because their hands are dusty and the screen is in the sun. People write the material rather than the word "challan" because that is how a person describes a thing to another person.</p>
<p>None of that is going to change, and a system that requires it to change will be worked around by competent people who have real work to do. The wider version of the argument is in <a href="https://be-teck.com/blog/whatsapp-is-the-interface/">WhatsApp is the interface, whether you designed for it or not</a>.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>The vocabulary in your software is the vocabulary of the people who wrote it.</p>
<p>Find the real one by reading a few hundred real messages and counting, not by asking. Include the languages and scripts people actually type in. Collect the non-cases as carefully as the cases.</p>
<p>And keep every match a suggestion, which is what makes it safe to be generous.</p>]]></content:encoded></item>
<item><title>An alert that rings for everything is an alert nobody hears</title><link>https://be-teck.com/blog/an-alert-that-rings-for-everything/</link><guid isPermaLink="true">https://be-teck.com/blog/an-alert-that-rings-for-everything/</guid><pubDate>Tue, 01 Sep 2026 00:40:00 +0530</pubDate><description>Priority is the wrong axis, because everybody's work is important. Sort by what the message asks the reader to do, and there are only three answers.</description><category>notifications</category><category>design</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Every organisation that installs a notification system goes through the same arc.</p>
<p>The alerts are useful. More things become alerts, because each addition is individually justified. The volume rises. People stop reading. Somebody proposes a priority flag. Everything becomes high priority, because everybody's own work is important. People stop reading the high priority ones.</p>
<p>At the end of it the system delivers nothing, and the organisation has spent a lot of engineering effort to arrive at silence.</p>
<h2 id="importance-is-the-wrong-axis">Importance is the wrong axis<a class="anchor" href="#importance-is-the-wrong-axis" aria-label="Link to this section">#</a></h2>
<p>The instinct, when a message is missed, is to reach for importance: mark it urgent, give it a red badge, put it higher in the list.</p>
<p>That fails for a structural reason. Importance is assessed by the sender, and every sender's own work is important to them. A scale on which everything can be placed at the top is not a scale. Within a few months the flag carries no information at all, and you have taught people to ignore the one visual signal you had.</p>
<h2 id="the-useful-question">The useful question<a class="anchor" href="#the-useful-question" aria-label="Link to this section">#</a></h2>
<p>The question that does work is not how important a message is. It is <strong>what it asks the reader to do</strong>, and there are only three answers.</p>
<ul><li><strong>Nothing.</strong> You should know this happened. Read it whenever.</li><li><strong>Later.</strong> Look at this next time you are looking at things.</li><li><strong>Now.</strong> Somebody is standing still until you act.</li></ul>
<p>That is a property of the message, determined by its type, not a judgement made by a sender about their own priorities. Which is exactly why it stays meaningful: nobody can inflate it.</p>
<p>A signature request is always the third. It is not information about work; it is a request for a specific person's hand, and until that hand moves a document, a payment and usually another human being are all stopped.</p>
<p>A comment on a task is almost always the first. A task assigned with a date next week is the second, and so is a follow-up owed to a customer, provided somebody put a date on it rather than an intention — <a href="https://be-teck.com/blog/follow-up-is-a-schedule/">follow-up is a schedule, not a feeling</a>.</p>
<h2 id="what-went-wrong-for-us">What went wrong for us<a class="anchor" href="#what-went-wrong-for-us" aria-label="Link to this section">#</a></h2>
<p>A document was sent for signature. It sat there. The person who had to sign did not know they had to sign it.</p>
<p>The request went out carrying a generic type — <em>question</em> — and types are mapped onto rows in a routing grid. <em>Question</em> had been mapped, sensibly enough, onto the row for comments, whose default delivery is a bulletin: held back until the next scheduled broadcast, ringing nothing, arriving as one line among a dozen others that also did not need doing right now.</p>
<p>A document holding up a payment was delivered as chatter.</p>
<p>Every component in the chain did its job correctly. The design had simply never been asked what a signature request <em>is</em>. It now has its own type, sits on the row for things awaiting approval, and says plainly that it asks for an act. It arrives on its own and it rings. It also says which page of the document the signature goes on, because <em>sign this</em> without <em>here</em> is still a small piece of homework. The full account is <a href="https://be-teck.com/blog/filed-as-chatter/">filed as chatter</a>.</p>
<h2 id="quiet-is-a-feature">Quiet is a feature<a class="anchor" href="#quiet-is-a-feature" aria-label="Link to this section">#</a></h2>
<p>The fix, when this surfaces, is almost never to make things louder.</p>
<p>Loudness is a resource with a fixed supply. An application that rings for everything is an application people mute, and a muted application delivers nothing at all.</p>
<p>The quiet tier is doing real work for the messages that genuinely belong to it. The mistake was never that quiet delivery exists — it was that a request for action had been classified into it.</p>
<p>So the repair is to stop lying about what the message wants. Once a request says <em>this asks somebody to act</em>, the routing follows on its own and nobody has to argue about priority.</p>
<h2 id="accuracy-is-the-whole-asset">Accuracy is the whole asset<a class="anchor" href="#accuracy-is-the-whole-asset" aria-label="Link to this section">#</a></h2>
<p>A separate failure, and the more expensive one.</p>
<p>A chaser in our system rang the finance team every few days about money that had already left the account, because a payment made in stages never wrote the field that meant <em>this is paid</em>.</p>
<p>Nobody reported it. That is the part worth sitting with. It is not that somebody noticed and was ignored. It is that a recurring reminder which is occasionally wrong teaches you to skim the whole class of reminder, and once you skim it, the one that matters costs the same as the ones that do not.</p>
<p>The chaser was not merely useless. It was spending the credibility of every other chaser in the building. An alerting system's accuracy is not a quality attribute to be improved over time — it is the entire asset, and a system that is right most of the time is worth close to nothing.</p>
<p>The underlying data fault is described in <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<h2 id="one-event-one-message">One event, one message<a class="anchor" href="#one-event-one-message" aria-label="Link to this section">#</a></h2>
<p>A smaller discipline that matters more than it sounds.</p>
<p>A delivery failure in our system used to open one ticket per recipient. So a single five-minute outage during a message to eight people produced eight tickets, each needing its own manual close.</p>
<p>The outage was one event. It is now one ticket, with the affected recipients carried inside it.</p>
<p>Any alerting design should be checked for this: what happens when one cause produces many symptoms. Systems that alert per symptom flood at exactly the moment attention is scarcest, which is the worst possible timing. There is more on that in <a href="https://be-teck.com/blog/one-outage-one-ticket/">one outage, one ticket</a>.</p>
<h2 id="tell-the-person-who-can-act">Tell the person who can act<a class="anchor" href="#tell-the-person-who-can-act" aria-label="Link to this section">#</a></h2>
<p>The last rule, and it is the one that most often gets a system used rather than disabled.</p>
<p>Six mailboxes in our estate had lost their permission to send, one of them for over a week, and they stayed broken because of <strong>who was being told</strong>. The failure raised a ticket for the IT team — but IT cannot reconnect somebody else's mail account. Only its owner can, from their own browser, with their own password.</p>
<p>So the ticket sat open while the person whose mail had quietly stopped flowing never heard a word.</p>
<p>The routing question is not only <em>how loud</em>. It is <em>to whom</em>, and the answer is whoever can actually do something. A correctly urgent alert delivered to somebody powerless is the same as no alert, plus a false sense that it was handled.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Route by what a message asks the reader to do, not by how important its sender thinks it is. There are three answers and only one of them rings.</p>
<p>Keep the quiet tier, because it is what makes the loud one mean something. Make sure the alerts are right, because a chaser that is sometimes wrong spends the credibility of every other chaser you have.</p>
<p>Collapse many symptoms into one event. And send it to the person who can act, which is frequently not the person your escalation table names.</p>]]></content:encoded></item>
<item><title>One outage should be one ticket</title><link>https://be-teck.com/blog/one-outage-one-ticket/</link><guid isPermaLink="true">https://be-teck.com/blog/one-outage-one-ticket/</guid><pubDate>Tue, 01 Sep 2026 00:30:00 +0530</pubDate><description>Systems that raise an alert per symptom flood at exactly the moment attention is scarcest, and the flood is usually one cause wearing many names.</description><category>notifications</category><category>records</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>A message fails to reach eight people because a service was unavailable for five minutes.</p>
<p>Eight tickets open. Each has to be read, understood and closed by hand. All eight describe the same five minutes.</p>
<p>This is not a rare pathology. It is the default behaviour of almost every system that raises alerts, because alerts are naturally written at the point of failure, and the point of failure is per-attempt.</p>
<h2 id="why-per-symptom-alerting-is-the-default">Why per-symptom alerting is the default<a class="anchor" href="#why-per-symptom-alerting-is-the-default" aria-label="Link to this section">#</a></h2>
<p>Nobody designs it. It emerges.</p>
<p>Somewhere in the code, a send fails. The person writing that code does the responsible thing and raises a ticket. It is one line, it is correct, and it is tested with a single failure.</p>
<p>In production, failures are not single. They are correlated — one dead service, one expired credential, one network partition — and every correlated failure takes the same path through that line.</p>
<p>So the number of alerts is proportional to the number of <em>attempts</em> during an outage, which is a function of your traffic rather than of the problem's size. A busy hour produces a hundred tickets for the same cause.</p>
<h2 id="what-the-flood-costs">What the flood costs<a class="anchor" href="#what-the-flood-costs" aria-label="Link to this section">#</a></h2>
<p><strong>Manual closing.</strong> Somebody must close each one, and closing tickets teaches people that tickets are noise.</p>
<p><strong>The real one is buried.</strong> During a flood, an unrelated genuine problem arrives and lands in the middle of ninety copies of something else.</p>
<p><strong>The pattern is destroyed.</strong> Ninety tickets from one cause and one ticket from another cause look like a ratio, and any counting you do afterwards is wrong.</p>
<p><strong>Attention is spent at the worst moment.</strong> The flood arrives exactly when somebody needs to think clearly about one thing.</p>
<h2 id="group-by-cause-carry-the-details-inside">Group by cause, carry the details inside<a class="anchor" href="#group-by-cause-carry-the-details-inside" aria-label="Link to this section">#</a></h2>
<p>The fix is to make the unit of alerting the <strong>cause</strong>, not the attempt.</p>
<p>One outage, one ticket. The affected recipients, records or attempts travel inside it as a list. If more failures occur while the ticket is open, they join it rather than creating siblings. The same discipline on a building is one snag, one row, rather than four reports of the same cracked tile — <a href="https://be-teck.com/blog/the-snag-list-that-closes/">a snag list that actually closes</a>.</p>
<p>Three implementation questions decide whether this works.</p>
<p><strong>What is the key?</strong> What makes two failures the same event. Usually the service or resource that failed, plus a time window. Getting this too narrow reproduces the flood; too wide and genuinely different problems merge.</p>
<p><strong>When does the ticket close?</strong> Ideally on recovery, automatically, with the duration recorded. A ticket that must be closed by hand after the problem has gone will be closed late or not at all.</p>
<p><strong>What if the cause changes?</strong> A ticket that stays open for a week accumulating unrelated failures is worse than a flood, because now nothing is separable. A time bound on grouping is necessary.</p>
<h2 id="the-ticket-has-to-describe-the-system-that-exists">The ticket has to describe the system that exists<a class="anchor" href="#the-ticket-has-to-describe-the-system-that-exists" aria-label="Link to this section">#</a></h2>
<p>A related failure, and in some ways a worse one, because the ticket count is fine and the content is wrong.</p>
<p>Our own message-delivery tickets used to tell people to create an approved template in a service we had retired months earlier. That service was gone. The bridge that replaced it has no templates and no approvals. So the ticket had been sending people to fix a problem that could not exist.</p>
<p>Its sibling was worse. When a handset stopped answering, the ticket said messages were being routed via the other provider. There is no other provider. They were not being sent at all — and the ticket's wording actively reassured whoever read it.</p>
<p>Both now describe the system that is actually running, and each names the real cause with the one action that fixes it: the handset needs re-pairing, the secret no longer matches, nothing is answering at the address, or the service was too busy to reply.</p>
<p>The general lesson is that <strong>alert text ages faster than alert logic</strong>. The condition that fires the alert gets maintained because it breaks visibly. The sentence describing it does not, because a wrong sentence produces no error. A message describing a system that no longer exists is a silent, permanent misdirection, and it is worth explicitly re-reading alert text whenever architecture changes. The wider argument is in <a href="https://be-teck.com/blog/the-app-should-tell-you-why/">the app should tell you why</a>.</p>
<h2 id="tell-the-person-who-can-fix-it">Tell the person who can fix it<a class="anchor" href="#tell-the-person-who-can-fix-it" aria-label="Link to this section">#</a></h2>
<p>Grouping correctly and describing correctly still fails if the ticket goes to the wrong desk.</p>
<p>Six mailboxes in our estate had lost their authorisation to send, one of them for over a week, and they stayed broken because of who was being told. The failure raised a ticket for the IT team — but IT cannot reconnect somebody else's mail account. Only its owner can, from their own browser, with their own password.</p>
<p>So the ticket sat open while the person whose mail had quietly stopped flowing never heard a word.</p>
<p>Now the owner is told directly, with a one-tap link that starts the reconnect and an explanation of why it happened — usually a password change, which revokes the permission by design. IT still gets its ticket for the record.</p>
<p>That is the right shape: the actionable notification goes to whoever can act, and the record goes to whoever needs the record. They are different messages with different purposes and they should not be the same message sent to a list.</p>
<h2 id="silent-failure-is-the-worse-cousin">Silent failure is the worse cousin<a class="anchor" href="#silent-failure-is-the-worse-cousin" aria-label="Link to this section">#</a></h2>
<p>Everything above is about too many alerts. The opposite failure is quieter and more expensive.</p>
<p>A classifier in our system asked a small local model, in words, for a JSON array, and hoped. It got prose wrapped around the answer, or ran out of room mid-array and stopped before the closing bracket. It failed twenty-nine times over twenty-four days, quarantined real mail, and opened a ticket each time.</p>
<p>Twenty-nine tickets is a flood by the standards of this article, and it was still the <em>good</em> outcome, because the alternative — discarding the mail quietly — would have been invisible.</p>
<p>The eventual fix removed the failure rather than the alert: constrained decoding, where anything but valid output is impossible to produce. That is always the better order. Suppressing an alert because it is noisy, without fixing what it is reporting, converts a loud problem into a silent one.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Alert on causes, not on attempts. One outage, one ticket, with the affected items carried inside it and an automatic close on recovery.</p>
<p>Re-read the words in your alerts whenever the architecture changes, because alert text ages faster than alert logic and a wrong sentence produces no error.</p>
<p>Send the actionable message to whoever can act, and the record to whoever needs a record.</p>
<p>And when an alert is noisy, fix the thing it is reporting before you quieten it. The related discipline of routing by what a message asks somebody to do is in <a href="https://be-teck.com/blog/an-alert-that-rings-for-everything/">an alert that rings for everything</a>.</p>]]></content:encoded></item>
<item><title>An import you cannot reverse is an import you should not run</title><link>https://be-teck.com/blog/an-import-you-cannot-reverse/</link><guid isPermaLink="true">https://be-teck.com/blog/an-import-you-cannot-reverse/</guid><pubDate>Tue, 01 Sep 2026 00:20:00 +0530</pubDate><description>Bringing history into a live system is a one-way door unless you build the way back first. Two properties make it safe, and both are cheap before the write.</description><category>records</category><category>how-we-work</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>Sooner or later somebody brings a spreadsheet of history into a live system. A register kept for years, a ledger from a previous tool, a list somebody maintained by hand.</p>
<p>It is one of the most useful things you can do — the history becomes searchable, connected and usable. It is also one of the few operations that can quietly corrupt a working system in a way nobody notices for months, and the difference between the two outcomes is decided entirely before the write.</p>
<h2 id="the-two-properties-that-make-it-safe">The two properties that make it safe<a class="anchor" href="#the-two-properties-that-make-it-safe" aria-label="Link to this section">#</a></h2>
<p><strong>Idempotent.</strong> Running it twice writes nothing the second time. This is what lets you run it, check it, and run it again after a fix without producing duplicates.</p>
<p><strong>Reversible.</strong> Every row it wrote can be identified and only those rows. This is what lets you undo it if the check afterwards finds something wrong.</p>
<p>Both come from the same mechanism: <strong>tag every imported row with a marker that identifies the import and the source row</strong>. Ours was a short prefix plus the source document's own reference. That single field makes the second run write nothing, and makes the reversal an exact selection rather than a query somebody constructs afterwards from dates and hope.</p>
<p>Add it before the write or you will not add it at all, because after the write the rows are indistinguishable from everything else.</p>
<h2 id="reconcile-before-you-write">Reconcile before you write<a class="anchor" href="#reconcile-before-you-write" aria-label="Link to this section">#</a></h2>
<p>The rule we hold to hardest here: <strong>a parse that cannot reproduce the total it claims is not a parse anybody should import.</strong></p>
<p>When we brought eight months of a <a href="https://be-teck.com/blog/concrete-grades-what-m25-means/">concrete register</a> into our own system, the verification was that the parsed rows had to reproduce three figures exactly — the row count, the total volume, and the total value — against the figures the register itself claimed.</p>
<p>They did not, at first. Two rows were missing: one with a blank serial number and one whose serial had been typed as a letter. Together they accounted for the discrepancy. Both were hunted down before a single row was written.</p>
<p>That check is worth more than any amount of spot-inspection afterwards, for a simple reason: a spot check confirms that the rows you looked at are right. A total confirms that the rows you did not look at are there.</p>
<p>If your source has no total to reconcile against, compute one from the source before parsing, by a different method, and reconcile to that. The point is two independent routes to the same number.</p>
<h2 id="decide-the-overlap-deliberately">Decide the overlap deliberately<a class="anchor" href="#decide-the-overlap-deliberately" aria-label="Link to this section">#</a></h2>
<p>The most dangerous part of any historical import is where the old records overlap the period the live system was already recording.</p>
<p>We had exactly this. Fifty-two rows in the register covered dates the live system had already been capturing through a different route. The register held one set of figures for those days; the system held another, smaller set.</p>
<p>They describe the same concrete, counted differently. Importing on top would have double-counted on a live ledger.</p>
<p>So those rows were <strong>not imported</strong>, and the decision was stated rather than guessed — it was escalated as a judgement for the owner rather than resolved by whichever rule happened to be easiest to implement.</p>
<p>The general shape: an overlap is not a technical problem with a correct answer. It is a question about which record is authoritative for that period, and that question belongs to a person. What the import must do is make the overlap visible before it runs, rather than silently applying a preference.</p>
<h2 id="preserve-what-the-source-knew">Preserve what the source knew<a class="anchor" href="#preserve-what-the-source-knew" aria-label="Link to this section">#</a></h2>
<p>An import is an opportunity that comes once, and the most common regret is having dropped fields because the target had nowhere to put them.</p>
<p>Our register carried things the live system had never held: who received each delivery, the document number, the rate including tax, the workability reading, and the seven- and twenty-eight-day test results where they had been taken. Those were exactly the fields that turned the imported rows from a volume total into evidence — for the reasons set out in <a href="https://be-teck.com/blog/the-concrete-cube-test/">the concrete cube test</a>, a result with nothing to attach it to is a number with no owner.</p>
<p>If the target has no column, add one. Discarding a field at import time is permanent in practice, because nobody re-runs a historical import to recover a column they decided was unimportant.</p>
<h2 id="set-the-state-honestly">Set the state honestly<a class="anchor" href="#set-the-state-honestly" aria-label="Link to this section">#</a></h2>
<p>Imported rows land in some state, and the default is usually wrong.</p>
<p>Ours were marked as received, because the register <strong>is</strong> the proof of receipt — every row names the officer who took delivery. Left in the default state they would have shown <em>on the way, did it land?</em> for ever, on hundreds of rows, about concrete poured months earlier.</p>
<p>That would not have been a cosmetic problem. A screen full of permanently unanswerable questions is a screen people stop reading, and it would have taken the genuine current items down with it. A check that can never be satisfied is worse than no check — the same trap described in <a href="https://be-teck.com/blog/money-before-material/">money before material</a>, where a warning that was always on had become wallpaper.</p>
<h2 id="back-up-the-specific-table-and-say-so">Back up the specific table, and say so<a class="anchor" href="#back-up-the-specific-table-and-say-so" aria-label="Link to this section">#</a></h2>
<p>Before the write, back up what the write touches. Not the whole database as a matter of ceremony — the specific table, so the restore is a real option rather than a theoretical one.</p>
<p>And record, in the change log, that it was done. Somebody looking at this a year from now needs to know the backup exists and where.</p>
<h2 id="the-order-that-works">The order that works<a class="anchor" href="#the-order-that-works" aria-label="Link to this section">#</a></h2>
<ol><li>Parse, and reconcile to a total the source itself claims.</li><li>Resolve the rows that will not parse, individually, by hand.</li><li>Identify the overlap with existing data and put the decision to a person.</li><li>Add the marker field to every row that will be written.</li><li>Back up the target table.</li><li>Write, in a transaction.</li><li>Run it again and confirm it writes nothing.</li><li>Verify the totals in the live system against the source.</li></ol>
<p>Steps one, three and seven are the ones people skip, and they are the three that decide whether the import is recoverable.</p>
<h2 id="migrations-deserve-the-same-discipline">Migrations deserve the same discipline<a class="anchor" href="#migrations-deserve-the-same-discipline" aria-label="Link to this section">#</a></h2>
<p>Everything above applies to schema migrations as well, with one addition: migrations should be <strong>additive and idempotent</strong>, and proven so by running them repeatedly against a throwaway copy before they go anywhere near production.</p>
<p>Ours are applied to production ahead of the code that needs them, in that order, always. Code that expects a column which does not exist yet fails immediately and visibly. A column that exists before the code needs it is harmless.</p>
<p>And where a migration cannot be made automatic, it is stated as a manual step in the release notes rather than assumed. An unstated manual step is a production incident with a delay fuse.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>Tag every row you write so a second run does nothing and a reversal is exact. Reconcile to a total the source itself claims, before writing anything.</p>
<p>Put the overlap in front of a person instead of resolving it by rule. Keep the fields the source knew and your system did not. Set the imported state to what is actually true, not to the default.</p>
<p>And back up the specific table you are touching, so that the way out is something you have rather than something you would have to invent.</p>]]></content:encoded></item>
<item><title>A test that describes the code will defend a bug</title><link>https://be-teck.com/blog/a-test-that-defends-a-bug/</link><guid isPermaLink="true">https://be-teck.com/blog/a-test-that-defends-a-bug/</guid><pubDate>Tue, 01 Sep 2026 00:10:00 +0530</pubDate><description>A regression test anchored on how the code works, rather than on the rule it is meant to enforce, will guard a defect as loyally as a feature — and report green.</description><category>how-we-work</category><category>principles</category><category>tempo</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>The purpose of a test is to state a rule and check that the system obeys it.</p>
<p>A very large number of tests do something subtly different: they state what the code currently does and check that it still does it. Those two things look identical while the code is correct, and they diverge sharply the moment it is not.</p>
<h2 id="the-test-that-held-a-defect-in-place">The test that held a defect in place<a class="anchor" href="#the-test-that-held-a-defect-in-place" aria-label="Link to this section">#</a></h2>
<p>A concrete case from our own system, and it is the least comfortable thing we found that week.</p>
<p>A payment made in stages was not being recognised as paid, because the instalment path never wrote the field that means <em>this is paid</em>. There is a prompt that should appear on an order once its money has settled — <em>this is paid, close it?</em> — and on staged orders it never appeared.</p>
<p>The prompt had a test. The test passed.</p>
<p>It passed because it was anchored on the same stale field the code was reading. At the time it was written, that field was what the code checked, so the test faithfully described the code. It went on passing happily while the prompt failed to appear on exactly the orders it was built for.</p>
<p>A test that describes the code rather than the rule will defend a defect as loyally as it defends a feature, and it will do it while reporting green.</p>
<h2 id="why-this-happens-so-easily">Why this happens so easily<a class="anchor" href="#why-this-happens-so-easily" aria-label="Link to this section">#</a></h2>
<p>Because the code is right there.</p>
<p>When you write a test after the implementation, the implementation is the clearest available description of what the system does, and the path of least resistance is to assert against it. The test then has exactly the same blind spots as the code, because it was derived from it.</p>
<p>The rule, meanwhile, exists in somebody's head, in a requirement written months ago, or in a conversation. Getting it into the test requires going back to it deliberately.</p>
<p>This is not a discipline problem that can be solved by trying harder. It is a consequence of the order in which things are written, and the only reliable counter is to state the rule in the test's own language — in domain terms, with values a person would recognise — rather than in the code's terms.</p>
<h2 id="the-check-that-was-wrong-about-itself">The check that was wrong about itself<a class="anchor" href="#the-check-that-was-wrong-about-itself" aria-label="Link to this section">#</a></h2>
<p>A second case, and the mechanism is different enough to be worth telling.</p>
<p>We had a defect where an invisible overlay was swallowing clicks across a whole page. The fix was general: an overlay that cannot be seen may not take a click.</p>
<p>To stop it coming back, we wrote an automated check that looked at the relevant code and confirmed the two necessary things sat together.</p>
<p>The check passed. It passed with the bug sitting directly in front of it.</p>
<p>The long comment explaining the fix had been placed <strong>between</strong> the two things the check needed to compare, which pushed one of them outside the window it was looking at. So the check saw one and not the other, concluded nothing was wrong, and would have gone on concluding that for as long as anybody cared to trust it.</p>
<p>We only found out because we put the bug back on purpose to watch the check go red. It did not. The check now strips comments before it looks, and it was re-tested the same way. The whole episode is in <a href="https://be-teck.com/blog/the-complaint-names-the-wrong-thing/">the complaint names the wrong thing</a>.</p>
<h2 id="watch-it-fail">Watch it fail<a class="anchor" href="#watch-it-fail" aria-label="Link to this section">#</a></h2>
<p>The single most valuable habit in this area takes about a minute.</p>
<p><strong>Break the thing on purpose and confirm that something notices.</strong></p>
<p>A test you have never seen fail is a test you are trusting on its own word. It might be asserting nothing. It might be looking at the wrong object. It might have been silently skipped for a year because a filter changed. All of these are common and none of them is visible in a green result.</p>
<p>Almost nobody does this, which is why so many green suites are green for reasons unrelated to the code being correct.</p>
<h2 id="anchor-on-the-rule-not-the-mechanism">Anchor on the rule, not the mechanism<a class="anchor" href="#anchor-on-the-rule-not-the-mechanism" aria-label="Link to this section">#</a></h2>
<p>Practically, the difference shows up in what the test asserts against.</p>
<p><strong>Describes the code:</strong> asserts that a particular field is empty, that a particular function was called, that a query has a particular shape, that a value is stored in a particular place.</p>
<p><strong>Describes the rule:</strong> asserts that after an advance and a balance are recorded, the order is treated as settled — by whatever means the system uses to decide that.</p>
<p>The second survives a refactor. More importantly, the second <em>fails</em> when the refactor is wrong, which is the entire reason the test exists.</p>
<p>The best available anchor is a real case with real values that a person from the business would recognise. Our own money rules are held to the figures from an actual settled order, which means the assertions are checkable by somebody who is not a programmer.</p>
<h2 id="one-rule-one-implementation-one-test">One rule, one implementation, one test<a class="anchor" href="#one-rule-one-implementation-one-test" aria-label="Link to this section">#</a></h2>
<p>There is a structural point underneath all of this.</p>
<p>If a rule is implemented in two places, testing one of them tells you nothing about the other. And rules do get implemented twice — we found the same question about whether money had settled being asked in nine separate places, each written by somebody who reasonably assumed the obvious field meant what it looked like it meant. The account is <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>.</p>
<p>The remedy is the same one that fixes the underlying defect: one function owns the rule, everything asks it, and the test tests that function. A test suite cannot compensate for a rule that has been copied. It can only ever check the copy it was pointed at.</p>
<h2 id="what-a-suite-should-be-for">What a suite should be for<a class="anchor" href="#what-a-suite-should-be-for" aria-label="Link to this section">#</a></h2>
<p>Not proof of correctness, which it cannot provide.</p>
<p>A suite is a set of statements about what must remain true, written so that a change which breaks one of them is caught by somebody other than a customer. Its value is entirely a function of whether those statements are about the domain or about the implementation.</p>
<p>Which suggests a review question worth asking of any existing suite: pick five tests at random and ask, for each, <strong>what rule would a business person recognise here?</strong> If the answer is a description of code structure, that test will defend whatever the code does, correct or not.</p>
<h2 id="the-short-version">The short version<a class="anchor" href="#the-short-version" aria-label="Link to this section">#</a></h2>
<p>A test written from the implementation inherits the implementation's blind spots and will guard a bug while reporting green.</p>
<p>State the rule in domain terms, with values somebody outside engineering would recognise. Break the thing on purpose and watch the test go red before you trust it. And remember that a test can only check the copy of a rule it was pointed at — which is one more reason a rule should exist only once. The principle behind that is in <a href="https://be-teck.com/blog/append-only-records/">append-only records</a> and, more directly, in every gap we have written about here.</p>]]></content:encoded></item>
<item><title>The gap you stopped noticing</title><link>https://be-teck.com/blog/the-gap-you-stopped-noticing/</link><guid isPermaLink="true">https://be-teck.com/blog/the-gap-you-stopped-noticing/</guid><pubDate>Mon, 31 Aug 2026 00:00:00 +0530</pubDate><description>Most broken things at work are not unsolved — they are worked around so smoothly nobody calls them broken. Breaking that habit is why BE Teck exists.</description><category>gaps</category><category>why-we-exist</category><category>principles</category><author>hello@be-teck.com (BE Teck)</author><content:encoded><![CDATA[<p>There is a particular kind of broken thing that never gets fixed.</p>
<p>It is not the dramatic kind. Nothing crashes, nobody escalates, no one writes a report about it. It is the form that has to be filled twice. The number that only one person knows how to look up. The step where somebody re-types what a machine already knew. Every day it costs a few minutes and a small amount of attention, and every day somebody quietly absorbs the cost.</p>
<p>Then the second thing happens, and it is the important one: <strong>the workaround becomes the habit.</strong> Somebody works out how to get around the problem, teaches it to the next person, and within a year the workaround is simply how the job is done. The gap has not closed. It has been staffed.</p>
<h2 id="why-nobody-fixes-it">Why nobody fixes it<a class="anchor" href="#why-nobody-fixes-it" aria-label="Link to this section">#</a></h2>
<p>Ask why it is like that and the answer comes back in a very recognisable shape — <em>that is simply how things work.</em> It is said without resentment, usually by someone competent, and it is nearly always false. It is not a description of reality. It is a description of how long everyone has been living with something.</p>
<p>That sentence is the reason BE Teck exists. People inside BE kept hitting the same walls and kept being told the same thing, and eventually somebody refused to walk around the wall for the tenth time.</p>
<h2 id="three-rules-and-the-third-is-the-odd-one">Three rules, and the third is the odd one<a class="anchor" href="#three-rules-and-the-third-is-the-odd-one" aria-label="Link to this section">#</a></h2>
<p>BE Teck takes on very few things, because three rules decide everything.</p>
<h3 id="it-has-to-be-real">It has to be real<a class="anchor" href="#it-has-to-be-real" aria-label="Link to this section">#</a></h3>
<p>No demos, no decks, no pilots that quietly die. If a thing cannot survive a full working day in the field, on a bad connection, it is not finished and we do not call it built. The test is never the demo. The test is the worst day.</p>
<h3 id="it-has-to-be-big-enough-to-matter">It has to be big enough to matter<a class="anchor" href="#it-has-to-be-big-enough-to-matter" aria-label="Link to this section">#</a></h3>
<p>Small annoyances can wait. The gaps worth taking are the ones that cost people time, money or safety every day, and the ones where being wrong has a real consequence — a payment, a document, a site, a person's month.</p>
<h3 id="it-is-not-about-the-money">It is not about the money<a class="anchor" href="#it-is-not-about-the-money" aria-label="Link to this section">#</a></h3>
<p>This is the rule people find hardest to believe, and it is the one that actually shapes the work. BE Teck exists to give something back, not to extract. If the right answer to a problem is to hand a thing over, or give it away, that is what happens. Profit was never the point of forming it.</p>
<p>The third rule is not decoration. It changes what gets built, because it removes the pressure to keep a problem alive so that a product can keep selling the cure.</p>
<h2 id="how-to-spot-one">How to spot one<a class="anchor" href="#how-to-spot-one" aria-label="Link to this section">#</a></h2>
<p>If you want to find these gaps in your own work, do not look for complaints. Complaints mean the problem is still visible, and a visible problem usually has someone assigned to it. Look for <strong>calm</strong> instead:</p>
<ul><li>A step everybody performs but nobody can justify.</li><li>Knowledge that lives in one person's head and has never been written down.</li><li>A rule that exists only because of a limitation that was removed years ago.</li><li>Something you have personally stopped mentioning because mentioning it never changed anything.</li></ul>
<p>That last one is the strongest signal there is. The moment you stop complaining about something is usually the moment it became permanent.</p>
<blockquote><p>We close the gaps everyone else learns to live with. Not a tech company. A repair habit that got organised.</p></blockquote>
<p>Two of the gaps we have found this way are written up in full, and both began as something nobody had thought worth mentioning: <a href="https://be-teck.com/blog/a-fact-that-had-no-owner/">a fact that had no owner</a>, where a paid order kept asking to be paid again, and <a href="https://be-teck.com/blog/written-and-never-wired/">written, and never wired</a>, where the fix already existed and had no button.</p>
<p>If something in your daily work is broken in a way everybody has stopped complaining about, that is exactly what we want to hear about. Write to <a href="mailto:hello@be-teck.com">hello@be-teck.com</a> and describe the wall.</p>]]></content:encoded></item>
</channel>
</rss>
