<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nova Solutions</title>
    <description>The latest articles on DEV Community by Nova Solutions (@nova_solutions).</description>
    <link>https://dev.to/nova_solutions</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4002879%2Fe9b89975-e8e8-41ef-8f64-6809bd538f1d.png</url>
      <title>DEV Community: Nova Solutions</title>
      <link>https://dev.to/nova_solutions</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nova_solutions"/>
    <language>en</language>
    <item>
      <title>Your missed-call text-back is not firing: six things that break it</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:14:28 +0000</pubDate>
      <link>https://dev.to/nova_solutions/your-missed-call-text-back-is-not-firing-six-things-that-break-it-4k95</link>
      <guid>https://dev.to/nova_solutions/your-missed-call-text-back-is-not-firing-six-things-that-break-it-4k95</guid>
      <description>&lt;p&gt;&lt;em&gt;The dashboard says the message sent. The customer never got it. That gap has a small number of causes, and they are worth ruling out in a specific order.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape of the problem
&lt;/h2&gt;

&lt;p&gt;A missed-call text-back is a short chain, and a break anywhere in it looks identical from the outside: the call comes in, nobody picks up, and no text arrives. Your software usually reports success, because from its point of view it did everything it was asked to do.&lt;/p&gt;

&lt;p&gt;That is why guessing is expensive here. The six causes below are ordered by how often they turn out to be the answer, and the first one accounts for most of the silent failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Carrier registration is missing or was rejected
&lt;/h2&gt;

&lt;p&gt;US carriers require application-to-person messaging sent from a standard ten-digit number to be registered: a brand, and a campaign describing what you send and how people consented. Unregistered traffic is filtered or blocked rather than returned with an error.&lt;/p&gt;

&lt;p&gt;This is the failure mode that wastes the most time, because nothing in your own tooling looks wrong. The send succeeded. The handoff succeeded. The message simply stopped at the carrier. If your text-back worked at some point and then quietly stopped, check whether a campaign lapsed or was rejected before you check anything else.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Registration is a carrier requirement, not a law. There is usually no fine attached. The penalty is that your messages do not arrive, which for a lead-capture automation is the entire cost.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. A previous STOP is still suppressing that number
&lt;/h2&gt;

&lt;p&gt;If a specific customer never gets your text-back while everyone else does, look for a revocation. Someone who once replied STOP to any of your messaging, including a campaign unrelated to this one, will usually sit on a permanent suppression list.&lt;/p&gt;

&lt;p&gt;This is working as intended and you should not try to route around it. Consent revocation has to be honored, and the rules give you a limited window to act on it. The right response is to recognize it as the cause and stop debugging, not to find a way to message that person anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The trigger is listening to the wrong call outcome
&lt;/h2&gt;

&lt;p&gt;A missed call is not one event. Declining on your handset, letting it ring out, forwarding to voicemail, answering and immediately dropping, and a call that never reaches your device at all can all be distinct outcomes to whatever is watching the line.&lt;/p&gt;

&lt;p&gt;Plenty of setups are wired to one of those and not the others, which produces the most confusing version of this problem: it works sometimes. If yours fires for some real calls and not others, this is usually why.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test each outcome separately rather than testing once and declaring it working.&lt;/li&gt;
&lt;li&gt;Check whether calls that go through a forwarding chain still register as missed on the instrumented number.&lt;/li&gt;
&lt;li&gt;Confirm the automation is watching the number customers actually dial, not a secondary line.
## 4. Business-hours logic is suppressing it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many setups ship with a schedule, and the default is often business hours. That quietly removes the automation from exactly the window it was bought for: evenings, weekends, and the hours when the person who normally answers is asleep.&lt;/p&gt;

&lt;p&gt;A missed call at eight on a Saturday evening is not a lower-value lead than one at eleven on a Tuesday. It is usually a higher-value one, because fewer competitors are picking up. Check the schedule before you assume the automation is broken, because a schedule doing its job looks exactly like a failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The number is not text-enabled, or is the wrong type
&lt;/h2&gt;

&lt;p&gt;A traditional landline cannot send or receive SMS unless it has been text-enabled. That is a single setting somewhere, and it is invisible until you try to use it.&lt;/p&gt;

&lt;p&gt;Beyond that, number types are treated differently by carriers. Toll-free numbers, ten-digit long codes, and short codes each have their own registration path and their own filtering behaviour. Using the wrong one for your volume and use case tends to produce inconsistent delivery rather than total failure, which is harder to spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The message body is getting filtered
&lt;/h2&gt;

&lt;p&gt;Carriers filter on content as well as registration. Messages that read like unsolicited marketing, lean heavily on shortened links, or use formatting associated with spam can be dropped even from a properly registered campaign.&lt;/p&gt;

&lt;p&gt;For a text-back this is easy to avoid, because the message that performs best is also the message least likely to be filtered: short, plainly identifying your business, referring to the call that just happened, and asking a question. Keeping promotional content out of it helps on this front and on the compliance front at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order to check, and when to stop
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm carrier registration is active and the campaign was approved.&lt;/li&gt;
&lt;li&gt;Check whether the affected number is on a suppression list.&lt;/li&gt;
&lt;li&gt;Test every missed-call outcome separately, not just the one that is easy to reproduce.&lt;/li&gt;
&lt;li&gt;Read the schedule, including timezone.&lt;/li&gt;
&lt;li&gt;Confirm the sending number is text-enabled and the right type for the use case.&lt;/li&gt;
&lt;li&gt;Simplify the message body and retest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have been through all six and it still does not fire reliably, the honest read is that you are now maintaining infrastructure rather than running a business. That is the point at which a managed setup stops being a convenience and starts being the cheaper option, because the cost of a text-back that silently does not work is every lead it was supposed to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions this post answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does my missed-call text-back say sent but never arrive?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost always carrier filtering. US carriers require application-to-person traffic from a ten-digit number to be registered with a brand and a campaign, and unregistered or rejected traffic gets dropped rather than bounced. Your software reports a successful handoff because it did hand off. The message just never made it past the carrier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does it work when I test it but not for real customers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two common reasons. You may be testing from a number that is already on an allowlist or has messaged you before, and you may be testing a call outcome that differs from a real one. A call you decline on your handset, a call that forwards to voicemail, and a call that rings out can be three different events to the automation, and only some of them may be wired to the trigger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an old STOP reply block future texts to that customer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and it should. Once someone revokes consent you have to honor it, and most platforms keep a permanent suppression list so you cannot accidentally message them again. If one specific customer never receives your text-back, check whether they ever replied STOP to anything you sent, including a different campaign.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the number I send from matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It matters a lot. A landline that has not been text-enabled cannot receive or send SMS at all, and toll-free, ten-digit long code, and short code numbers are registered and filtered differently. Sending from the wrong number type for your use case is a common cause of messages that deliver inconsistently rather than not at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How fast should the text actually go out?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast enough to beat the next contractor on the list, which in practice means seconds rather than minutes. The value of a text-back decays quickly, because the caller is still holding their phone. If yours is arriving several minutes later, treat that as a failure to fix rather than a quirk to live with.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/missed-call-text-back-not-working" rel="noopener noreferrer"&gt;www.advai.cloud/blog/missed-call-text-back-not-working&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>business</category>
      <category>programming</category>
    </item>
    <item>
      <title>What is actually in a data licensing agreement</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:12:04 +0000</pubDate>
      <link>https://dev.to/nova_solutions/what-is-actually-in-a-data-licensing-agreement-4o48</link>
      <guid>https://dev.to/nova_solutions/what-is-actually-in-a-data-licensing-agreement-4o48</guid>
      <description>&lt;p&gt;&lt;em&gt;Most of the value in one of these agreements is decided by clauses nobody reads out loud in the meeting. These are the ones worth slowing down for.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this post does not give you a template
&lt;/h2&gt;

&lt;p&gt;A lot of people searching for this are looking for a document to fill in. It is worth saying plainly why that is the wrong tool here.&lt;/p&gt;

&lt;p&gt;In most contracts, a template is a reasonable starting point because the variables are obvious: parties, dates, amounts. In a data licensing deal, the terms carrying the most value are the ones a template cannot guess, and getting one of them wrong does not produce an obviously bad contract. It produces a contract that looks fine and quietly gives away the asset.&lt;/p&gt;

&lt;p&gt;So instead, here is what each clause actually decides. Read it, form a view on what you want, then have a lawyer draft or review the real thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four clauses that decide the value
&lt;/h2&gt;

&lt;p&gt;These are the ones to slow down on, because each of them can be worth more than the number on the front page.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Clause&lt;/th&gt;
&lt;th&gt;What it decides&lt;/th&gt;
&lt;th&gt;The question to ask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exclusivity&lt;/td&gt;
&lt;td&gt;Whether you can license this data to anyone else, and for how long&lt;/td&gt;
&lt;td&gt;If this is exclusive, what am I giving up in every future deal?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Field of use&lt;/td&gt;
&lt;td&gt;What the buyer may use the data for&lt;/td&gt;
&lt;td&gt;Is this licensed for one purpose, or for anything they ever build?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Derivatives&lt;/td&gt;
&lt;td&gt;Who owns what comes out the other side&lt;/td&gt;
&lt;td&gt;If they train a model on this, what is my position in that model?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Term and survival&lt;/td&gt;
&lt;td&gt;When it ends, and what outlives the ending&lt;/td&gt;
&lt;td&gt;What exactly happens to every copy on the last day?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The scope clauses, in the order they usually matter&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The one people underweight&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Derivatives. In an AI deal, the data going in and the model coming out are different assets, and the second one often has the longer life. An agreement silent on derivatives has not quietly settled it in your favour.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The clause that is not optional
&lt;/h2&gt;

&lt;p&gt;Most of this list is commercial negotiation. One item is not.&lt;/p&gt;

&lt;p&gt;If the deal is structured around the data being de-identified under the CCPA, the statutory definition at Civil Code section 1798.140, subdivision (m) requires three things, and the third is that the business contractually obligates any recipients of the information to comply with all provisions of that subdivision. That includes the commitment not to attempt reidentification.&lt;/p&gt;

&lt;p&gt;This is not a nice-to-have term you can trade away for a better price. If it is missing, the data does not meet the statutory definition, and the reason the transfer sat outside the personal-information rules in the first place stops being true.&lt;/p&gt;

&lt;h2&gt;
  
  
  The clauses that protect you afterwards
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Representations and warranties: what you are promising about the data, and what you are not. Promising more than you can verify is the most common way a seller creates a problem for themselves.&lt;/li&gt;
&lt;li&gt;Indemnity: who carries the cost if something goes wrong, and whether it is capped. An uncapped indemnity from a small business to a large buyer is an asymmetric risk worth naming out loud.&lt;/li&gt;
&lt;li&gt;Security and handling obligations: how the recipient must store and transmit the data, and whether subcontractors are permitted.&lt;/li&gt;
&lt;li&gt;Onward transfer: whether the buyer may pass the data to affiliates, contractors, or acquirers. A license to one company can become a license to an industry through this clause alone.&lt;/li&gt;
&lt;li&gt;Audit rights: whether you can ever verify any of the above, and at whose cost.&lt;/li&gt;
&lt;li&gt;Confidentiality: covering the deal terms themselves, not only the data.&lt;/li&gt;
&lt;li&gt;Governing law and dispute resolution: which is the clause nobody reads until it is the only one that matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How payment is usually structured
&lt;/h2&gt;

&lt;p&gt;Payment terms vary more than people expect. A lump sum on delivery is the simplest and the easiest to value. Structures that pay over time, or that tie payment to the buyer's use, shift risk toward the seller and are much harder to verify without audit rights.&lt;/p&gt;

&lt;p&gt;If a broker is involved, the fee structure is its own term: whether it is a percentage, whether it is contingent on closing, and whether the broker is paid on renewals or expansions of the original license. Nova's own arrangement is a percentage paid only if you accept an offer and a deal closes, which is one model among several rather than a standard.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A test worth applying&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask what happens if the buyer's business changes. Acquisition, pivot, shutdown. If the answer is not in the document, the answer is whatever they decide later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Before you sign
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read your own privacy policy and customer contracts first. They can prohibit what the agreement permits.&lt;/li&gt;
&lt;li&gt;Decide your position on exclusivity and derivatives before the negotiation, not during it.&lt;/li&gt;
&lt;li&gt;Make sure the recipient-obligation clause is present if the deal rests on de-identification.&lt;/li&gt;
&lt;li&gt;Confirm what happens to every copy at termination, in writing.&lt;/li&gt;
&lt;li&gt;Have a lawyer review the actual document. Not a template, and not this post.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is general information about how these agreements are typically structured, plus one statutory requirement quoted from published text. It is not legal advice and it is not a substitute for a lawyer who has read your specific deal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(m), definition of deidentified, including the requirement at (m)(3) to contractually obligate recipients.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(v)(3), personal information does not include deidentified or aggregate consumer information.&lt;/li&gt;
&lt;li&gt;All other clause descriptions above are general commercial practice, not statutory requirements.
## Questions this post answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is there a standard data licensing agreement template?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are templates in circulation, and using one you cannot evaluate is how businesses sign away things they did not mean to. The terms that matter most in these deals, exclusivity, field of use, and ownership of derivatives, are exactly the ones a generic template will get wrong for your situation. The useful preparation is knowing what each clause does, then having a lawyer draft or review the actual document.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the most important clause?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually exclusivity, because it is the one that forecloses the future. An exclusive license can be worth more upfront and means you cannot license that data to anyone else, possibly ever. A non-exclusive license pays less per deal and leaves the asset intact for the next one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who owns a model trained on my data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whatever the derivatives clause says, which is why it deserves more attention than it usually gets. Data going into a training run and a model coming out of it are different assets, and an agreement that is silent on the second one has not left it unresolved in your favour. Decide it explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is any clause actually required by law?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One is, if the deal relies on the data being de-identified under the CCPA. The statutory definition requires the business to contractually obligate any recipients of the information to comply with all the same provisions, including not attempting reidentification. Without that clause the data does not meet the definition, and the whole structure the deal rests on comes apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to the data when the agreement ends?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only what the agreement says happens. Deletion, certification of deletion, and whether anything already derived from the data survives termination are separate questions with separate answers. A term that expires while the copies persist is not really a term.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/what-is-in-a-data-licensing-agreement" rel="noopener noreferrer"&gt;www.advai.cloud/blog/what-is-in-a-data-licensing-agreement&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>business</category>
      <category>privacy</category>
      <category>startup</category>
    </item>
    <item>
      <title>What de-identified actually means, and what it does not</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:09:21 +0000</pubDate>
      <link>https://dev.to/nova_solutions/what-de-identified-actually-means-and-what-it-does-not-13c5</link>
      <guid>https://dev.to/nova_solutions/what-de-identified-actually-means-and-what-it-does-not-13c5</guid>
      <description>&lt;p&gt;&lt;em&gt;It is the word every data licensing conversation turns on, and it is used loosely almost everywhere. In the two places it is defined precisely, it is a test with conditions rather than a description of effort.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one word carries the whole deal
&lt;/h2&gt;

&lt;p&gt;In a data licensing arrangement, de-identified is not marketing language. It is the hinge the entire structure hangs on, because the CCPA states that personal information does not include consumer information that is deidentified or aggregate consumer information. Clear the definition and the privacy obligations built on personal information do not reach the data. Miss it, and they all do.&lt;/p&gt;

&lt;p&gt;Which makes it worth knowing that four words get used interchangeably in ordinary conversation, two of them are defined in the statute, and they do not mean the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  De-identified: a three-part test
&lt;/h2&gt;

&lt;p&gt;Under Civil Code section 1798.140, subdivision (m), deidentified means information that cannot reasonably be used to infer information about, or otherwise be linked to, a particular consumer, provided the business that possesses it does three things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes reasonable measures to ensure the information cannot be associated with a consumer or household.&lt;/li&gt;
&lt;li&gt;Publicly commits to maintain and use the information in deidentified form and not to attempt to reidentify it, except to test whether its own deidentification process works.&lt;/li&gt;
&lt;li&gt;Contractually obligates any recipient to comply with all of the same provisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Notice what is not technical&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only the first condition is about the data. The second is something you have to publish, and the third is a clause that has to appear in the agreement. A flawlessly scrubbed dataset that ships without those two has not met the definition.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pseudonymized: the key still exists
&lt;/h2&gt;

&lt;p&gt;The CCPA defines pseudonymization separately, at subdivision (aa): processing personal information in a manner that renders it no longer attributable to a specific consumer without the use of additional information, provided that the additional information is kept separately and is subject to technical and organizational measures ensuring the personal information is not attributed to an identified or identifiable consumer.&lt;/p&gt;

&lt;p&gt;Read that carefully and the difference is obvious. Pseudonymization assumes a key exists and is being kept somewhere safe. De-identification claims the link cannot reasonably be rebuilt at all. Swapping customer names for stable customer IDs is pseudonymization. It is a genuine safeguard, and it is not the same claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aggregate: a different category, not a stronger one
&lt;/h2&gt;

&lt;p&gt;Aggregate consumer information is defined at subdivision (b) as information relating to a group or category of consumers, from which individual consumer identities have been removed, that is not linked or reasonably linkable to any consumer or household, including via a device.&lt;/p&gt;

&lt;p&gt;Then the definition adds a sentence that settles a very common misconception: aggregate consumer information does not mean one or more individual consumer records that have been deidentified.&lt;/p&gt;

&lt;p&gt;So rolling records up into counts and averages is aggregation. De-identifying a million individual rows is not aggregation, however many rows there are. They are two separate categories with two separate tests, and only the statute's own words settle which one you are in.&lt;/p&gt;

&lt;h2&gt;
  
  
  HIPAA runs its own standard entirely
&lt;/h2&gt;

&lt;p&gt;For protected health information none of the above applies. HIPAA sets its own de-identification standard at 45 CFR 164.514(b), with two routes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Where it is defined&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Safe Harbor&lt;/td&gt;
&lt;td&gt;Remove eighteen enumerated identifiers, and have no actual knowledge that the remaining information could identify a person&lt;/td&gt;
&lt;td&gt;45 CFR 164.514(b)(2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expert Determination&lt;/td&gt;
&lt;td&gt;A person with appropriate statistical and scientific expertise concludes the reidentification risk is very small, and documents the analysis&lt;/td&gt;
&lt;td&gt;45 CFR 164.514(b)(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The two HIPAA de-identification methods&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The eighteen identifiers include names, most geographic subdivisions, dates, telephone and fax numbers, email addresses, URLs, IP addresses, Social Security numbers, medical record numbers, device identifiers and serial numbers, vehicle identifiers, and biometric identifiers. Safe Harbor is used more often than Expert Determination, mostly because it is specified precisely enough to demonstrate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with this in a real negotiation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Define the term in the agreement itself. Do not let anonymized do load-bearing work when it has no statutory definition.&lt;/li&gt;
&lt;li&gt;Check that the public commitment actually exists and is published, not just agreed internally.&lt;/li&gt;
&lt;li&gt;Check the recipient-obligation clause is present and binds downstream recipients too.&lt;/li&gt;
&lt;li&gt;Be honest internally about whether you have de-identified or pseudonymized. If someone in the building holds a key, you have pseudonymized.&lt;/li&gt;
&lt;li&gt;If any of it is health data, stop and use the HIPAA standard with proper advice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post describes published statutory text. It is general information, not legal advice, and it cannot account for your sector or the specific records you hold. Have a lawyer look at the actual data before you agree to a definition in a contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(m), definition of deidentified.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(aa), definition of pseudonymize and pseudonymization.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(b), definition of aggregate consumer information.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(v)(3), personal information does not include deidentified or aggregate consumer information.&lt;/li&gt;
&lt;li&gt;HIPAA Privacy Rule, &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-E/section-164.514" rel="noopener noreferrer"&gt;45 CFR 164.514&lt;/a&gt;(b)(1) and 164.514(b)(2), with de-identification guidance published by the US Department of Health and Human Services.
## Questions this post answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What does de-identified data mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under the CCPA it means information that cannot reasonably be used to infer information about, or otherwise be linked to, a particular consumer, provided the business takes reasonable measures to ensure it cannot be associated with a consumer or household, publicly commits to keep it that way and not attempt reidentification, and contractually obligates any recipient to do the same. It is a three-part test, not a description of how hard you tried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is de-identified the same as anonymized?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not in US statutory terms. Anonymized is a common-usage word that appears in everyday conversation and in some non-US frameworks, but the CCPA does not define it. What the CCPA defines is deidentified, and that is the term that determines whether the privacy obligations apply. Using anonymized in a contract without defining it leaves the most important word in the deal undefined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between de-identified and pseudonymized?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pseudonymization, defined separately in the CCPA, means processing personal information so it is no longer attributable to a specific consumer without the use of additional information, where that additional information is kept separately and protected. The link still exists. Someone holds the key. De-identification is the stronger claim that the link cannot reasonably be reconstructed at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does aggregating the data count as de-identifying it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and the statute is unusually direct about this. Aggregate consumer information means information about a group or category of consumers that is not linked or reasonably linkable to any consumer or household, and the definition ends by stating that it does not mean one or more individual consumer records that have been deidentified. They are separate categories with separate tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does HIPAA define it differently?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HIPAA does not use the CCPA test at all. It provides two routes at 45 CFR 164.514(b): the Safe Harbor method, which requires removing eighteen enumerated identifiers and having no actual knowledge that what remains could identify someone, and the Expert Determination method, in which a qualified person concludes and documents that the reidentification risk is very small. If you hold health data, this is your standard, not the CCPA one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/what-de-identified-data-actually-means" rel="noopener noreferrer"&gt;www.advai.cloud/blog/what-de-identified-data-actually-means&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>datascience</category>
      <category>security</category>
    </item>
    <item>
      <title>Can a business legally license its own customer data?</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:06:53 +0000</pubDate>
      <link>https://dev.to/nova_solutions/can-a-business-legally-license-its-own-customer-data-km2</link>
      <guid>https://dev.to/nova_solutions/can-a-business-legally-license-its-own-customer-data-km2</guid>
      <description>&lt;p&gt;&lt;em&gt;The question almost every owner asks first, and the answer is more specific than either yes or no. It turns on one definition, and on what you did to the data before anyone else saw it.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest answer
&lt;/h2&gt;

&lt;p&gt;Usually yes, but not in the form it is sitting in right now. There is no single federal statute that says a business may not license data it holds. What there is instead is a layer of state privacy law, a layer of sector-specific rules, and a layer of promises you have already made in your own documents. All three have to clear.&lt;/p&gt;

&lt;p&gt;That is a more useful answer than a flat yes or no, because it tells you where the work is. Almost all of it happens before the data leaves your systems, and almost none of it is about the transaction itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Read this first&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is general information about published statutory text. It is not legal advice, it does not create any professional relationship, and it cannot account for your state, your sector, or the specific records you hold. Talk to a lawyer before relying on it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What counts as a sale, and why the definition is so wide
&lt;/h2&gt;

&lt;p&gt;California's Consumer Privacy Act is the most commonly cited reference point, and its definition of a sale is deliberately broad. Under Civil Code section 1798.140, subdivision (ad)(1), sell, selling, sale, or sold means selling, renting, releasing, disclosing, disseminating, making available, transferring, or otherwise communicating a consumer's personal information by the business to a third party for monetary or other valuable consideration.&lt;/p&gt;

&lt;p&gt;Two things in that sentence do more work than people expect. Making available is in the list, so you do not have to hand anything over for it to count. And monetary or other valuable consideration means a barter, a discount, or a credit lands in the same place as a cheque.&lt;/p&gt;

&lt;p&gt;Where a transfer is a sale of personal information, consumers have a right to opt out of it under section 1798.120. That is not a fatal problem, but it is an operational one: you would be taking on an ongoing obligation to honor opt-outs against data you have already licensed to somebody else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mechanism the statute itself provides
&lt;/h2&gt;

&lt;p&gt;The same statute supplies the way through. Section 1798.140, subdivision (v)(3) states plainly that personal information does not include consumer information that is deidentified or aggregate consumer information.&lt;/p&gt;

&lt;p&gt;If the information is not personal information, the sale rules built on top of personal information do not reach it. That is the whole architecture, and it is why every serious data licensing arrangement is built around deidentification rather than around consent.&lt;/p&gt;

&lt;p&gt;The catch is that deidentified is a defined term with three conditions, not a description of effort. Under subdivision (m), it means information that cannot reasonably be used to infer information about, or otherwise be linked to, a particular consumer, provided that the business possessing it does all of the following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes reasonable measures to ensure that the information cannot be associated with a consumer or household.&lt;/li&gt;
&lt;li&gt;Publicly commits to maintain and use the information in deidentified form and not to attempt to reidentify it, except to test whether its own deidentification process works.&lt;/li&gt;
&lt;li&gt;Contractually obligates any recipients of the information to comply with all of the same provisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The part people skip&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two of the three conditions are not technical. One is a public commitment you have to actually publish, and one is a contract term that has to bind every recipient. A perfectly scrubbed file that ships without them has not met the definition.&lt;/p&gt;
&lt;h2&gt;
  
  
  Health data is a separate regime, not a harder one
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;If what you hold is protected health information, none of the above is the governing test. HIPAA has its own deidentification standard at 45 CFR 164.514(b), and it offers two routes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Safe Harbor, at 164.514(b)(2): remove eighteen enumerated identifiers, including names, most geographic subdivisions, dates, phone and fax numbers, email addresses, URLs, IP addresses, Social Security numbers, medical record numbers, device identifiers and serial numbers, vehicle identifiers, and biometric identifiers, and have no actual knowledge that what remains could identify a person.&lt;/li&gt;
&lt;li&gt;Expert Determination, at 164.514(b)(1): a person with appropriate statistical and scientific expertise determines that the risk of reidentification is very small, and documents the analysis supporting that conclusion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Safe Harbor is used more often simply because it is precisely specified and therefore easier to demonstrate. Neither route is something to attempt from a blog post. If you are in this category, the first call is to counsel, not to a broker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your own documents can be stricter than the law
&lt;/h2&gt;

&lt;p&gt;This is the constraint that catches people, because it does not appear in any statute. Your privacy policy is a public promise. Your customer agreements are private ones. Your vendor contracts may restrict what you can do with data that passed through their systems.&lt;/p&gt;

&lt;p&gt;A statute sets a floor. A promise you published sits above it, and nothing about a licensing deal erases it. If your privacy policy says you never share customer information with third parties, that sentence governs you regardless of how thoroughly you deidentified anything.&lt;/p&gt;

&lt;p&gt;The practical sequence is therefore backwards from what most people expect. Read your own documents first. Then look at the statute. Then think about a transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a defensible version looks like
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The copy that leaves is deidentified to a defined standard, not simply stripped of obvious names.&lt;/li&gt;
&lt;li&gt;You have published the commitment the definition requires, not just made it internally.&lt;/li&gt;
&lt;li&gt;Every recipient is contractually bound to the same conditions, including not attempting reidentification.&lt;/li&gt;
&lt;li&gt;The license is non-exclusive and scoped, so you have not signed away the ability to use your own records.&lt;/li&gt;
&lt;li&gt;You keep every original, in your own systems, unchanged.&lt;/li&gt;
&lt;li&gt;Anything touching health, legal privilege, or children gets sector-specific advice before anything moves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is exotic, and none of it is fast. It is the difference between a transaction you can explain to a regulator, a customer, or an acquirer, and one you cannot. Again: this is general information about published rules, not legal advice. Before anything leaves your systems, have a lawyer look at your situation specifically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;California Consumer Privacy Act, &lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(ad)(1), definition of sell, selling, sale, or sold.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(m), definition of deidentified and its three conditions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.140" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.140&lt;/a&gt;(v)(3), personal information does not include deidentified or aggregate consumer information.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=CIV&amp;amp;sectionNum=1798.120" rel="noopener noreferrer"&gt;Cal. Civ. Code 1798.120&lt;/a&gt;, the consumer right to opt out of sale or sharing.&lt;/li&gt;
&lt;li&gt;HIPAA Privacy Rule, &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-E/section-164.514" rel="noopener noreferrer"&gt;45 CFR 164.514&lt;/a&gt;(b)(1) Expert Determination and 164.514(b)(2) Safe Harbor, with guidance published by the US Department of Health and Human Services.
## Questions this post answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is it legal to sell customer data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selling identifiable customer data is legal in many US contexts but heavily regulated, and under the CCPA it counts as a sale that consumers can opt out of. Licensing properly deidentified data is a different question, because the CCPA states that personal information does not include consumer information that is deidentified or aggregate consumer information. The work is in meeting the statutory definition of deidentified, not in the sale itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What counts as a sale under the CCPA?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The statute defines it broadly. Selling, renting, releasing, disclosing, disseminating, making available, transferring, or otherwise communicating a consumer's personal information to a third party for monetary or other valuable consideration. Note the last five words: you do not need to be paid in cash for it to count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does deidentifying the data actually solve it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is the mechanism the statute itself provides, but it is a three-part test, not a single step. California requires reasonable measures so the information cannot be associated with a consumer or household, a public commitment to keep it deidentified and not attempt reidentification, and a contractual obligation on any recipient to comply with the same rules. Strip names and stop there and you have not met it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if my business holds health records?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then a different and stricter regime applies. HIPAA sets out two methods for deidentifying protected health information: removing eighteen enumerated identifiers under the Safe Harbor method, or an Expert Determination that the reidentification risk is very small, documented by a qualified person. Health data is not a harder version of the same problem, it is a separate one, and it needs sector-specific advice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can my own contracts stop me even if the law allows it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and this is the trap people miss. Your published privacy policy, your customer terms, and your vendor agreements may each promise things about how data is used. A statute setting a floor does not override a promise you made above it. Read your own documents before you read anyone else's.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this legal advice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It is general information about publicly available statutory text, written for owners deciding whether the idea is worth exploring at all. Your state, your sector, and the specific data you hold all change the answer. Get advice from a lawyer before acting on any of it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/can-a-business-legally-license-customer-data" rel="noopener noreferrer"&gt;www.advai.cloud/blog/can-a-business-legally-license-customer-data&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>business</category>
      <category>datascience</category>
    </item>
    <item>
      <title>GEO vs SEO: what actually changed, with our own numbers</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:04:12 +0000</pubDate>
      <link>https://dev.to/nova_solutions/geo-vs-seo-what-actually-changed-with-our-own-numbers-1kmo</link>
      <guid>https://dev.to/nova_solutions/geo-vs-seo-what-actually-changed-with-our-own-numbers-1kmo</guid>
      <description>&lt;p&gt;&lt;em&gt;GEO is being sold as a new discipline with its own price tag. We looked at our own sites instead of taking anyone's word for it, and the numbers point somewhere more specific than a new service.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The pitch being sold right now
&lt;/h2&gt;

&lt;p&gt;Search a term like "generative engine optimization services" and the results are a wall of agency listicles, several of them advertising specific numbers: hundreds of percent growth in AI citations, several-times return on investment, all at retainers in the $3,000 to $10,000-plus a month range.&lt;/p&gt;

&lt;p&gt;We are not going to add our own version of that claim to the pile, and not because we do not care about the category. We simply do not have signed clients or documented results to cite, and we are not going to invent any. What we do have is our own measured data, across our own four sites, which is worth more here anyway: nobody has an incentive to make it look better than it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we pulled, and from where
&lt;/h2&gt;

&lt;p&gt;Google Search Console has a dedicated "Generative AI features" report, separate from the regular Performance report, that tracks how often a page shows up inside an AI-generated answer rather than a traditional blue-link result. It is a citation and visibility signal, not a click signal: AI Overviews are largely zero-click by design, the answer is often served without anyone visiting the page.&lt;/p&gt;

&lt;p&gt;We first checked this report across four sites we run on 2026-09-05, and pulled it again today to see whether the pattern held or was a one-time artifact. It held, and every property grew.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers, three weeks apart
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;AI impressions (Sep 5)&lt;/th&gt;
&lt;th&gt;AI impressions (Sep 28)&lt;/th&gt;
&lt;th&gt;Growth&lt;/th&gt;
&lt;th&gt;Top-cited page&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Government-services directory&lt;/td&gt;
&lt;td&gt;1,400&lt;/td&gt;
&lt;td&gt;2,490&lt;/td&gt;
&lt;td&gt;1.8x&lt;/td&gt;
&lt;td&gt;A specific province's land-use and demographic page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Citizen-safety guide site&lt;/td&gt;
&lt;td&gt;179&lt;/td&gt;
&lt;td&gt;529&lt;/td&gt;
&lt;td&gt;3.0x&lt;/td&gt;
&lt;td&gt;A city-specific emergency-preparedness guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B SaaS marketing site (this one)&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;235&lt;/td&gt;
&lt;td&gt;2.8x&lt;/td&gt;
&lt;td&gt;A cost breakdown for a specific market&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company homepage&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;1.3x&lt;/td&gt;
&lt;td&gt;The homepage itself, brand-query dominated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;GSC "Generative AI features" report, 90-day trailing window, both pulls&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two things stand out. Every property grew, in a range of 1.3x to 3.0x in three weeks, on a report we were not actively trying to move. And the ranking of which property grew fastest lines up almost exactly with how much factual, single-purpose reference content each one carries versus how much of the site is a pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets cited is not what you would guess
&lt;/h2&gt;

&lt;p&gt;On every single property, the pages with the most AI-citation impressions are not the homepage, not a service page, not a pricing page. They are the pages that answer one specific, factual question as directly as possible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The government-services site's top page is a specific province's land-area, population, and land-use status, not its homepage or its product page.&lt;/li&gt;
&lt;li&gt;The citizen-safety site's top page is a specific city's emergency-preparedness guide, not its app-download page.&lt;/li&gt;
&lt;li&gt;This site's own top page is a cost breakdown for a specific market, not a service lander.&lt;/li&gt;
&lt;li&gt;The one exception, the plain company homepage, is dominated by its own brand name being searched directly, which is a different mechanism entirely, not a counterexample.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the same pattern that already drives ordinary organic search on these same sites. Specific, well-sourced, clearly structured reference content wins both surfaces, because an AI system reading a page to decide whether to cite it is doing something close to what a search engine already does when deciding whether to rank it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we do not sell GEO as its own line
&lt;/h2&gt;

&lt;p&gt;If the work that wins AI citations is the same work that wins ordinary search, selling a separate "GEO package" alongside an SEO package means charging twice for one piece of work. We do not do that, and we say so plainly rather than staying quiet about it.&lt;/p&gt;

&lt;p&gt;Showing up in AI answers is included in our Local SEO work: service-area pages, citations, on-page structure, and Google Business Profile upkeep, done every month. It is a feature of doing that work properly, not a separate line item with a separate invoice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The honest version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If someone offers to sell you GEO as a stand-alone service with its own monthly fee, ask what it actually includes that good SEO does not already do. In our own experience building this, the honest answer is very little.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What this is not saying
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This is not a traffic claim. AI Overview impressions are largely zero-click; a citation is a visibility signal, not a visitor.&lt;/li&gt;
&lt;li&gt;The absolute numbers are still small everywhere except the government-services site. 55 and 235 impressions over 90 days are thin samples, not proof of a channel at scale.&lt;/li&gt;
&lt;li&gt;This is a snapshot comparison at two points three weeks apart, not a rate we are tracking continuously. We would want a few more check-ins before calling the growth curve reliable.&lt;/li&gt;
&lt;li&gt;None of this is a result we produced for a client. It is our own properties, measured by us, which is exactly why we can show it without violating our own rule against citing results we have not verified.
## Questions this post answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What is GEO (generative engine optimization)?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GEO is the practice of structuring content so it gets cited inside an AI-generated answer, whether that is a Google AI Overview, a ChatGPT response, or a Perplexity summary, rather than just earning a ranked position in a traditional list of results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GEO vs SEO: what is actually different?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Less than the terms suggest. SEO optimizes a page to rank for a search query. GEO optimizes a page to be the one an AI system quotes when answering a question. Our own data across four sites shows the same pages winning both: specific, factual, clearly structured content that answers one question directly. The audience differs (a search engine's ranking algorithm versus a language model choosing what to cite), but the actual work of building a good page is close to identical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will AI replace SEO?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not in the sense of making it unnecessary. AI answer engines still need something to read and cite, and our own measured data shows they cite the same kind of page that already ranks well in ordinary search: clear, factual, well-structured content. SEO is not becoming obsolete. It is becoming the same work that also wins the AI-answer surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you get cited in Google AI Overviews or ChatGPT?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Based on what our own data shows across four sites: build a page that answers one specific, factual question clearly, with real structure (headings, direct answers, tables where they help) rather than a general pitch page. The pages that got cited in our numbers were reference and how-to pages, not landing pages or service descriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you sell GEO as a separate service?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, deliberately. We treat it as a feature of doing SEO properly rather than a separate line item, because the two are built the same way. Selling a GEO package on top of an SEO package would mean charging twice for one piece of work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/geo-vs-seo-what-actually-changed" rel="noopener noreferrer"&gt;www.advai.cloud/blog/geo-vs-seo-what-actually-changed&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Is missed-call text-back legal?</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Wed, 30 Sep 2026 09:01:23 +0000</pubDate>
      <link>https://dev.to/nova_solutions/is-missed-call-text-back-legal-2i9c</link>
      <guid>https://dev.to/nova_solutions/is-missed-call-text-back-legal-2i9c</guid>
      <description>&lt;p&gt;&lt;em&gt;Short answer: yes, in the ordinary case. The longer answer is that three separate rule sets apply at once, and only one of them is actually a law.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;Texting back a person who just called your business, promptly, about the thing they called about, is the ordinary case and it is generally allowed. That is not a loophole. It is the least surprising thing you can do with a number someone dialed you from thirty seconds ago.&lt;/p&gt;

&lt;p&gt;Where businesses actually get into trouble is not the text-back itself. It is what they put in the message, what they do when someone says stop, and whether they registered with the carriers at all. Those are three separate rule sets, they come from three different places, and only one of them is a law.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Read this first&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is general information, not legal advice. It describes publicly available FCC rules and one Supreme Court decision. It cannot account for your state, your industry, or what your particular message says. Talk to a lawyer before you rely on it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  First: a text is a call
&lt;/h2&gt;

&lt;p&gt;The governing US statute is the Telephone Consumer Protection Act, 47 U.S.C. 227, with the FCC's implementing rules at 47 CFR 64.1200. People sometimes assume it covers voice only. It does not. In its 2003 TCPA Order the FCC confirmed that a text message is a call for TCPA purposes, so every consent rule written for calls applies to SMS as well.&lt;/p&gt;

&lt;p&gt;That is the starting point, and it is why a text-back deserves five minutes of thought rather than none. It is also why a lot of the advice you will find written about phone calls is directly relevant to your SMS setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the consent comes from when someone calls you
&lt;/h2&gt;

&lt;p&gt;The FCC's position here is old and it is stable. In its 1992 TCPA Order the Commission held that persons who knowingly release their phone numbers have in effect given their invitation or permission to be called at the number which they have given, absent instructions to the contrary.&lt;/p&gt;

&lt;p&gt;A customer who dials your business has knowingly released their number to you, and they did it for the specific purpose of reaching you about a job. A reply on that subject is the most obviously invited message there is. This is the plain reason a text-back sits in a different category from a cold marketing blast to a purchased list.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The practical line&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The consent you have is tied to why they called. Answer that. The further your message drifts from the reason they picked up the phone, the less the 1992 position is doing for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A federal court reached a version of the same conclusion on a phone call, not a text. In Butera v. Sugarhouse Real Estate Group, decided in the District of Utah on June 30, 2025, the plaintiff called the defendant's number back after a missed call and hung up without leaving a voicemail. When the business called him again the next morning, the court held that call was not unsolicited: a callback made in response to the plaintiff's own call was not an independent, unprompted solicitation under the do-not-call rules, because it is ordinary behavior to return a missed call displayed on a phone.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where this does, and does not, reach&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is one district court, deciding a live phone call under the do-not-call "more than one solicitation" framework (47 CFR 64.1200(c), (f)(15)), not an automated text under the consent rules that actually govern a text-back. It is not binding outside that court, and it does not resolve the text-message question on its own. What it does confirm, from a different direction, is the same basic idea: responding to contact the other person started is not the kind of thing these rules were written to stop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The autodialer question, after Duguid
&lt;/h2&gt;

&lt;p&gt;The TCPA's strictest consent requirements attach to calls made with an automatic telephone dialing system. For years the scope of that phrase was genuinely unsettled, and courts disagreed about whether ordinary business software counted.&lt;/p&gt;

&lt;p&gt;The Supreme Court resolved it on April 1, 2021 in Facebook, Inc. v. Duguid. The Court held that the statutory definition requires equipment that uses a random or sequential number generator. Facebook's login-notification system, which texted specific numbers tied to specific accounts, did not qualify.&lt;/p&gt;

&lt;p&gt;A missed-call text-back is the same shape. It does not generate numbers at random or walk a sequence. It replies to the one number that just rang your line. On the federal definition, that is generally not an autodialer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not over-read this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Duguid narrowed one prong of one statute. It did not repeal the marketing-consent rules, the do-not-call rules, the revocation rules below, or any state statute, several of which define autodialer more broadly than the federal one. It is a reason not to panic, not a reason to skip the rest of this page.&lt;/p&gt;
&lt;h2&gt;
  
  
  The line that moves everything: marketing content
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;The TCPA treats two kinds of message very differently. A message that is informational or transactional, answering the thing the person contacted you about, sits in one tier. A message that advertises or promotes sits in a stricter tier that requires prior express written consent, which is a specific, documented thing rather than an inference from behaviour.&lt;/p&gt;

&lt;p&gt;This is the single easiest way to turn a defensible text-back into an indefensible one, and it usually happens by accident. Someone decides the auto-reply is wasted space and adds a seasonal discount to it. That one sentence can move the whole message into the tier that needed written consent you never collected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Safer: sorry we missed you, what can we help with, when suits you for a visit.&lt;/li&gt;
&lt;li&gt;Riskier: sorry we missed you, and ask about our spring tune-up special, twenty percent off this month.&lt;/li&gt;
&lt;li&gt;The first answers the call. The second sells something they did not ask about.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  STOP, and the ten business days
&lt;/h2&gt;

&lt;p&gt;In February 2024 the FCC adopted an order strengthening a consumer's ability to revoke consent. It is the most operationally specific rule on this page, and compliance has been required since April 11, 2025.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A person can revoke consent in any reasonable manner. You cannot require them to use one exclusive channel or a particular magic word.&lt;/li&gt;
&lt;li&gt;Replying STOP, or anything that reasonably conveys the same thing, creates a presumption that consent was revoked.&lt;/li&gt;
&lt;li&gt;You must honor a revocation within a reasonable time, not to exceed ten business days from receipt.&lt;/li&gt;
&lt;li&gt;After a revocation you are limited to a single confirmation message, and it must not contain marketing content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a text-back system specifically, the thing worth checking is whether opt-outs propagate. It is common for STOP to stop one campaign while another automation keeps messaging the same person from a different number. That is the failure mode this rule is aimed at.&lt;/p&gt;

&lt;h2&gt;
  
  
  A2P 10DLC: not a law, but it decides whether anything arrives
&lt;/h2&gt;

&lt;p&gt;The last layer is not government at all. US carriers require application-to-person messaging sent from standard ten-digit numbers to be registered: a brand and a campaign, filed with The Campaign Registry, describing who you are and what you send. Unregistered traffic gets filtered or blocked.&lt;/p&gt;

&lt;p&gt;Because it is a carrier rule rather than a statute, there is no fine to worry about in the ordinary case. The penalty is quieter and arguably worse. Your text-back appears to work in testing, the dashboard shows messages sent, and customers never receive them. If you have ever heard someone say their text-back stopped working for no reason, registration is the first thing to check.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Two different questions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Am I allowed to send this is a TCPA question. Will it actually be delivered is an A2P 10DLC question. You can be completely in the clear on the first and still have every message dropped on the second.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this means if you are switching one on
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Reply to the reason they called. Keep promotional content out of the automatic message.&lt;/li&gt;
&lt;li&gt;Send it promptly, while the call is obviously the context for the text.&lt;/li&gt;
&lt;li&gt;Identify your business in the message, so the recipient knows who is texting.&lt;/li&gt;
&lt;li&gt;Make opting out easy, honor it everywhere, and well inside ten business days.&lt;/li&gt;
&lt;li&gt;Register your brand and campaign for A2P 10DLC before you rely on delivery.&lt;/li&gt;
&lt;li&gt;Check your state. Several states have their own texting statutes with definitions broader than the federal one.&lt;/li&gt;
&lt;li&gt;If you handle health, financial, or legal matters, get advice specific to your sector before you automate anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic. It is the same instinct you would apply without any statute in front of you: answer the question they asked, do not sell them something they did not ask about, and stop when they say stop. The rules mostly just write that down and attach a deadline to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.law.cornell.edu/uscode/text/47/227" rel="noopener noreferrer"&gt;Telephone Consumer Protection Act of 1991, 47 U.S.C. 227&lt;/a&gt;; FCC implementing rules at &lt;a href="https://www.ecfr.gov/current/title-47/chapter-I/subchapter-B/part-64/subpart-L/section-64.1200" rel="noopener noreferrer"&gt;47 CFR 64.1200&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;FCC, Report and Order, CC Docket No. 92-90, FCC 92-443 (1992), on persons who knowingly release their phone numbers.&lt;/li&gt;
&lt;li&gt;FCC, Report and Order, CG Docket No. 02-278, 18 FCC Rcd 14014, 14115, para. 165 (2003), confirming that a text message is a call under the TCPA.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.supremecourt.gov/opinions/20pdf/19-511_p86b.pdf" rel="noopener noreferrer"&gt;Facebook, Inc. v. Duguid, No. 19-511&lt;/a&gt; (U.S. Apr. 1, 2021), on the definition of an automatic telephone dialing system.&lt;/li&gt;
&lt;li&gt;FCC, Report and Order, CG Docket Nos. 02-278 and 21-402, &lt;a href="https://docs.fcc.gov/public/attachments/FCC-24-24A1.pdf" rel="noopener noreferrer"&gt;FCC 24-24&lt;/a&gt; (released February 16, 2024), on revocation of consent; compliance required April 11, 2025.&lt;/li&gt;
&lt;li&gt;A2P 10DLC brand and campaign registration is administered by The Campaign Registry on behalf of US carriers. It is an industry requirement, not a federal rule.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.govinfo.gov/app/details/USCOURTS-utd-2_25-cv-00014" rel="noopener noreferrer"&gt;Butera v. Sugarhouse Real Estate Group, L.C.&lt;/a&gt;, 2025 WL 1798968 (D. Utah June 30, 2025), on a returned phone call not being an unsolicited call under 47 CFR 64.1200(c), (f)(15).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post is general information about published rules. It is not legal advice, and it does not create any professional relationship. Before you rely on it for your own business, speak to a lawyer who can look at your state, your sector, and the exact wording of your messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions this post answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is it legal to text someone back automatically after they call my business?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the ordinary case, yes. The FCC has held since its 1992 TCPA Order that a person who knowingly releases their phone number has in effect given permission to be contacted at that number, absent instructions to the contrary. Someone who dials your business has given you their number for exactly that purpose. The reply should stay on the subject of why they called.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the TCPA apply to text messages, or only phone calls?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both. The FCC confirmed in its 2003 TCPA Order that a text message is a call for TCPA purposes, so the statute's consent rules apply to SMS the same way they apply to voice calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a missed-call text-back count as an autodialer under the TCPA?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generally not, on the federal definition. In Facebook, Inc. v. Duguid the Supreme Court held in April 2021 that an automatic telephone dialing system must use a random or sequential number generator. A text-back does the opposite: it replies to the one specific number that just called you. That narrows one prong of the TCPA, but it does not switch off the marketing-consent rules or any state statute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if someone replies STOP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You have to honor it. The FCC's 2024 consent-revocation order requires callers and texters to treat revocation made in any reasonable manner as valid, and to honor it within a reasonable time not to exceed ten business days. STOP creates a presumption that consent was revoked. After that you are limited to a single confirmation message, and it cannot carry marketing content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need A2P 10DLC registration for missed-call text-back?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For business texting from a standard US ten-digit number, yes in practice. A2P 10DLC is not a law, it is a carrier requirement: you register a brand and a campaign with The Campaign Registry, and the major US carriers filter or block unregistered application-to-person traffic. An unregistered text-back tends to fail quietly, which is worse than failing loudly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Has a court actually ruled on returning a missed call?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, though on a phone call, not a text. In Butera v. Sugarhouse Real Estate Group (D. Utah, June 30, 2025), a business's call back the morning after the plaintiff himself called the business's number and hung up without leaving a voicemail was held not to be an unsolicited call, because a callback in response to your own call is not unsolicited. It is one district court, on a phone call under the do-not-call rules rather than a text under the consent rules, but the underlying idea, that responding to contact someone else initiated is not itself unsolicited, is the same one running through this whole page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this legal advice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. This is general information about publicly available FCC rules, one Supreme Court decision, and one district court decision, written for business owners deciding whether to switch a text-back on. Your situation, your state, and your message content all change the answer. Talk to a lawyer before relying on any of it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/is-missed-call-text-back-legal" rel="noopener noreferrer"&gt;www.advai.cloud/blog/is-missed-call-text-back-legal&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>business</category>
      <category>privacy</category>
      <category>startup</category>
    </item>
    <item>
      <title>The AI data economy just started paying small businesses too</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Sun, 27 Sep 2026 02:06:44 +0000</pubDate>
      <link>https://dev.to/nova_solutions/the-ai-data-economy-just-started-paying-small-businesses-too-f12</link>
      <guid>https://dev.to/nova_solutions/the-ai-data-economy-just-started-paying-small-businesses-too-f12</guid>
      <description>&lt;p&gt;&lt;em&gt;Reddit, Shutterstock, and the Associated Press have already sold data to AI labs. Less visible: the same demand for real operational data is now reaching small businesses, in deals structured very differently from a publisher license.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The deals that already made the news
&lt;/h2&gt;

&lt;p&gt;Over the past two years, several large publishers signed licensing deals with AI labs to let their content train models. Reddit struck an agreement with Google. Shutterstock has licensed image and caption data to multiple AI companies. The Associated Press signed a deal with OpenAI. None of the exact terms are fully public, but the pattern is consistent: a company that already has a large, structured archive of content licenses a copy of it, non-exclusively, for training use.&lt;/p&gt;

&lt;p&gt;What's less visible is that the same underlying demand doesn't stop at publishers. Model developers need more than clean, professionally written text. They need messy, realistic examples of how work actually gets done: how a dispatcher schedules a service call, how a sales rep answers an unusual customer question, how an ops team handles an edge case a policy document never anticipated. That kind of data mostly lives inside small and mid-size businesses, not media companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two real deals, further down market
&lt;/h2&gt;

&lt;p&gt;Two licensing deals closed in this smaller, less visible tier of the market. Names are withheld below, both by request and because the terms one small business gets don't depend on the industry press knowing whose CRM it was.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Seller&lt;/th&gt;
&lt;th&gt;Deal size&lt;/th&gt;
&lt;th&gt;Terms&lt;/th&gt;
&lt;th&gt;Time to close&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A business with roughly $3 million in annual revenue&lt;/td&gt;
&lt;td&gt;$100,000, paid upfront&lt;/td&gt;
&lt;td&gt;Non-exclusive, de-identified license&lt;/td&gt;
&lt;td&gt;3 business days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A manufacturer with fewer than 100 employees&lt;/td&gt;
&lt;td&gt;Comparable terms&lt;/td&gt;
&lt;td&gt;Non-exclusive, de-identified license&lt;/td&gt;
&lt;td&gt;Similarly fast&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Two closed data-licensing deals&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Both deals were arranged independently by a data-licensing partner, not by Nova Solutions. We're describing them because they're real, verifiable proof that this category exists and moves fast, not because we closed them ourselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “non-exclusive” and “de-identified” actually mean here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Non-exclusive: the seller can still license the same underlying data to a different buyer later. Nothing about the deal locks the data to one buyer forever.&lt;/li&gt;
&lt;li&gt;De-identified: the buyer receives a processed copy with names, account numbers, and other identifying details stripped or masked before it ever leaves the seller's systems.&lt;/li&gt;
&lt;li&gt;The seller's own systems and originals are untouched. Nothing about how the business operates changes after the deal closes.&lt;/li&gt;
&lt;li&gt;Price and buyer are approved by the seller before anything moves. There's no obligation to accept an offer that comes in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That structure is why the deal above closed in three business days: there was no negotiation over exclusivity, no migration of live systems, and no ongoing operational change to review. A one-time, de-identified export is a much smaller decision than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is happening now, not five years ago
&lt;/h2&gt;

&lt;p&gt;Two things changed at once. First, the supply of freely usable, high-quality text on the open web is thinner than it was: a lot of it is now paywalled, licensed, or contested in litigation, and labs that scraped without a license are facing lawsuits over it. Second, the models themselves have gotten good enough at general language that the next gains come from realistic, domain-specific examples, not more generic text. Ordinary operational data, the kind that sits in a CRM or a dispatch log and was never written for an audience, is exactly that kind of example.&lt;/p&gt;

&lt;p&gt;That's a different pitch than “your data is valuable,” which every business has been told for a decade. What changed is that there's now a real, structured buyer for a specific, narrow slice of it, at a price and speed that make it worth a business owner's actual attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you're the seller
&lt;/h2&gt;

&lt;p&gt;If you're evaluating whether this applies to your own business, the two deals above suggest a rough shape: the categories most likely to have licensable value right now are manufacturing, freight and logistics, accounting, finance, insurance, distribution, construction, professional services, and retail, businesses where operational records reflect judgment calls a model can learn from. Healthcare and legal records are currently held out of this category entirely, pending buyer-side legal clearance on protected information.&lt;/p&gt;

&lt;p&gt;We set up data licensing partnerships for businesses in the cleared categories above: preparing a de-identified sample, taking it to buyers, and letting the business approve the price and buyer before anything moves. If that's relevant to your business, it's worth a conversation even if nothing closes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions this post answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does “non-exclusive” mean in a data-licensing deal like this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It means the seller isn't locked into one buyer. The same underlying data could theoretically be licensed to a second buyer later, since the first deal doesn't grant exclusive rights to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why would an AI lab pay for a small business's CRM data instead of just using public web data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Public web text is thinner than it used to be, partly paywalled and partly contested in litigation over unlicensed scraping, and models have gotten good enough that the next gains come from realistic, domain-specific examples rather than more generic text. Ordinary operational records like CRM histories or dispatch logs are exactly that kind of example, and they mostly don't exist anywhere on the open web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who actually arranged the two deals described here?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both were arranged independently by a data-licensing partner, not by Nova Solutions. They're described here as real, verifiable evidence that this category of deal exists and moves quickly, not as our own track record.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/ai-labs-licensing-small-business-data" rel="noopener noreferrer"&gt;www.advai.cloud/blog/ai-labs-licensing-small-business-data&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>datascience</category>
      <category>startup</category>
    </item>
    <item>
      <title>What is an AI OS? A practical definition</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Fri, 25 Sep 2026 06:25:02 +0000</pubDate>
      <link>https://dev.to/nova_solutions/what-is-an-ai-os-a-practical-definition-2dn5</link>
      <guid>https://dev.to/nova_solutions/what-is-an-ai-os-a-practical-definition-2dn5</guid>
      <description>&lt;p&gt;&lt;em&gt;An AI OS is not a chatbot and not an agent framework. It is the connective layer between the messy state of your real business and the AI workflows you want to run on top of it.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap an AI OS fills
&lt;/h2&gt;

&lt;p&gt;A common pattern among mid-size Philippine companies is saying, in the same breath, "we already use AI" and "we have no idea what our customers are actually doing." That is the gap an AI OS fills. It is not a chatbot. It is not even an agent framework. It is the connective layer between the messy state of your real business and the AI workflows you want to run on top of it.&lt;/p&gt;

&lt;p&gt;This is the working definition I wish someone had handed me when I first sat down to design Nova AIOS. We will cover what an AI OS actually is, why Palantir Foundry is the canonical example, where the term breaks down, and what to look for if you are evaluating one for a PH or SEA enterprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  A working definition
&lt;/h2&gt;

&lt;p&gt;An AI OS, sometimes written AI Operating System or AIOS, is the layer of software that does four things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Models the real-world things your business cares about (customers, loans, properties, students, transactions, equipment) as typed objects with relationships.&lt;/li&gt;
&lt;li&gt;Provides a runtime for AI agents to read, reason about, and write to those objects.&lt;/li&gt;
&lt;li&gt;Enforces a permission model deciding which agent, on whose behalf, can touch which object in what way.&lt;/li&gt;
&lt;li&gt;Logs every action with enough fidelity to pass an audit, a regulator check, or a post-incident review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strip away the marketing and that is the whole shape. An ontology of business objects. A runtime that executes agents against them. A permission and audit layer that makes the result usable in regulated industries. If a vendor selling you an AI OS cannot show you, on a whiteboard, where each of those four pieces lives, you are buying a chatbot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI OS knows the state of your business. A chatbot only knows the sentence you just typed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why the term started showing up
&lt;/h2&gt;

&lt;p&gt;Three things happened at roughly the same time in 2023 and 2024 that made AI OS a useful phrase. First, language models stopped being parlor tricks and started being usable as workflow engines. You could give a model a complex multi-step task involving structured data and it would actually finish.&lt;/p&gt;

&lt;p&gt;Second, enterprises looked at the resulting work and realized something uncomfortable. Every team was building the same plumbing. Each new AI workflow needed its own data pipe, its own retrieval layer, its own observability, its own permission model. Twelve workflows meant twelve duplicated stacks of infrastructure.&lt;/p&gt;

&lt;p&gt;Third, Palantir Foundry had been quietly proving for a decade that you could build the plumbing once, model your business objects once, and ride that foundation through hundreds of downstream AI use cases. The model worked. The price tag was usually north of $500,000 USD per year, which kept it inside the Fortune 100 and the US Department of Defense. The phrase AI OS emerged as shorthand for the Foundry shape, available to people who are not the Pentagon. That is what almost every credible vendor in this category is building today, including us.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four layers, with examples
&lt;/h2&gt;

&lt;p&gt;Layer 1, the ontology, is the typed model of your business. For a microfinance institution the core objects are Borrower (name, contact methods, KYC documents, credit history, language preference), Loan (principal, balance, schedule, status, arrears state, with a relationship back to Borrower), Payment (amount, channel, date, applied-to-loan reference), and CollectionsAction (channel, script used, outcome, timestamp, plus a compliance flag tied to RA 11765 and the SEC MC 18 collection-conduct rules).&lt;/p&gt;

&lt;p&gt;Notice what is missing. There is no "chat message" object and no "document" object. The ontology is the things your business cares about, not the things your AI happens to produce. Documents and transcripts are inputs and outputs, not first-class objects. This sounds pedantic. It is the most important call you will make. Get it wrong and every downstream agent reasons about chat transcripts instead of loans, which means it can only make conversational decisions, not business ones.&lt;/p&gt;

&lt;p&gt;Layer 2, the agent runtime, is where AI workflows live. It needs to read the ontology fully typed and fast (every loan and payment for a borrower in under 200 milliseconds), write to the ontology transactionally, and compose agents. A collections agent does not exist alone. It calls a payment-status agent, which calls a credit-history agent, which calls a sentiment classifier on the last three messages. The runtime decides what runs in what order and what each step is allowed to see.&lt;/p&gt;

&lt;p&gt;Layer 3, the permission model, is not a feature. It is the difference between a tool you can ship to production and a science project. Can the collections agent see the borrower's health-related KYC notes? No. Can it see the outstanding balance? Yes. Can a customer-facing chatbot create a Payment object directly, or only suggest one for human approval? Depends on amount and channel. Can a marketing agent send promotional SMS to a borrower flagged as in arrears and sensitive? No, and the system should refuse to compose that message at all. This is the layer where RA 10173, RA 11765, and the BSP circulars live.&lt;/p&gt;

&lt;p&gt;Layer 4, audit and observability, logs every agent action, every read, every write, every refused permission. Not in the casual "we have logs somewhere" sense. In the sense that a BSP examiner can sit down and reconstruct any decision the system made in the last 18 months. This is the layer most pre-2024 AI products skipped, and the reason most never made it past pilot in a regulated industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI OS versus chatbot versus agent framework
&lt;/h2&gt;

&lt;p&gt;Three things people sometimes call an AI OS that are not one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A chatbot is a stateless conversational interface. It knows the current message and maybe a short rolling history. It does not know your business objects and cannot do an audited write to a loan record. It sits on top of an AI OS at best.&lt;/li&gt;
&lt;li&gt;An agent framework like LangChain, LangGraph, or CrewAI is a useful tool for composing agents, but it gives you layer two and partial layer four while leaving layers one and three to you. Building an AI OS on top of one is reasonable. Calling the framework itself an AI OS is a category error.&lt;/li&gt;
&lt;li&gt;A RAG pipeline grounds a model in your documents. It is not an AI OS for the same reason a document object is not a business object. RAG retrieves text; an AI OS reasons about typed state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When you should adopt one, and when not
&lt;/h2&gt;

&lt;p&gt;The honest test: if the same underlying business object will be touched by more than one AI workflow over the next 18 months, you need an AI OS. If only one workflow is on the roadmap, buy the single tool.&lt;/p&gt;

&lt;p&gt;A 200-loan microfinance startup that wants AI collections, AI loan screening, and a customer-facing FAQ chatbot needs an AI OS. Same borrower, same loan, three workflows. Without a shared ontology, each workflow grows its own borrower model and they drift. An HVAC contractor with one phone line that misses after-hours calls does not need an AI OS. They need a missed-call text-back automation. Buy the single tool, and come back when you have three more workflows that need to share customer state.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to evaluate an AI OS vendor
&lt;/h2&gt;

&lt;p&gt;Five questions to ask before you sign anything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you see the ontology in a UI, in plain language, before any agent is built? If the answer is "the ontology emerges from your data," walk away. A real AI OS makes the ontology explicit and editable.&lt;/li&gt;
&lt;li&gt;Show me an audit log entry from a real customer, with PII redacted. If they cannot produce one in under five minutes, they have not shipped to a regulated customer.&lt;/li&gt;
&lt;li&gt;What happens when an agent tries something the permission model forbids? You want a loud, audited refusal with an explanation. Not a silent skip. Not a hallucinated success.&lt;/li&gt;
&lt;li&gt;Who owns the data residency? In the Philippines, "our data is in AWS Singapore" is sometimes acceptable and sometimes not, depending on the regulator. The vendor should know the difference for your industry.&lt;/li&gt;
&lt;li&gt;What is the actual price after the first 90 days? Discovery and setup are usually quoted at a loss. The retainer for ongoing operations is where the cost lives. Ask for it in writing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What an AI OS costs in the Philippines and SEA
&lt;/h2&gt;

&lt;p&gt;Round numbers, as of mid-2026.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foundry-tier US vendor: $500,000 USD per year and up. Includes professional services, but you are paying for the brand and the certification stack.&lt;/li&gt;
&lt;li&gt;Mid-market US vendor: $80,000 to $250,000 USD per year. Usually a thinner version of the four-layer pattern with one or two layers stripped down.&lt;/li&gt;
&lt;li&gt;Nova AIOS build: ₱150,000 for a single-product deployment, scaling to about ₱1.2M for a multi-product enterprise rollout, plus a monthly operations retainer typically between ₱50,000 and ₱200,000.&lt;/li&gt;
&lt;li&gt;Build it yourself: free in cash, expensive in time. Twelve to eighteen months of senior engineering to reach a usable runtime. Often right for large banks. Almost never right for anyone below 500 employees.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The order-of-magnitude gap between US vendors and Philippine-built systems is not a quality gap. It is an engineering-economics gap. A senior Filipino ML engineer at a Philippine company costs about one-fifth of a senior ML engineer at a US enterprise software company. That ratio shows up in the price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake most teams make
&lt;/h2&gt;

&lt;p&gt;They start with the agent. Someone reads a blog post about a clever agent, copies the pattern, gets a demo working in a week, then spends six months trying to plug it into their actual business. The agent works in isolation. Connecting it to real customer data, real permission rules, and real audit requirements is where the project dies.&lt;/p&gt;

&lt;p&gt;The teams that ship to production start with the ontology. They map their Borrower, Loan, and Payment objects on a whiteboard, argue about field names for two days, and only then build the agent that reasons over them. The first version is dumber than the demo. The production version, three months later, is more useful by an order of magnitude. The ontology-first move is the single biggest predictor of whether an AI OS deployment makes it to production. If your vendor is not making you do the ontology work first, find a new vendor.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/what-is-an-ai-os" rel="noopener noreferrer"&gt;www.advai.cloud/blog/what-is-an-ai-os&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>We almost let our own automation cold-email its own founder</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Fri, 25 Sep 2026 06:16:16 +0000</pubDate>
      <link>https://dev.to/nova_solutions/we-almost-let-our-own-automation-cold-email-its-own-founder-33na</link>
      <guid>https://dev.to/nova_solutions/we-almost-let-our-own-automation-cold-email-its-own-founder-33na</guid>
      <description>&lt;p&gt;&lt;em&gt;The fix was supposed to be a one-line merge. Looking at the actual rows before running it found a FOIA desk, two charities, and the founder's own inbox sitting in the send queue.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The plan was to merge the backlog forward
&lt;/h2&gt;

&lt;p&gt;We were in the middle of repairing a broken cold-email queue on our own outreach pipeline. Part of the fix meant a backlog of contacts, stranded by the earlier bug, needed to rejoin the working pipeline. The plan, as written, was simple: merge the stranded backlog forward.&lt;/p&gt;

&lt;p&gt;A merge like that is easy to trust. The rows had been collected before, the fields lined up, and the fix elsewhere was already done. Nothing about the plan looked risky on paper: it was a data operation, not new code, and data operations tend to get less scrutiny than the code around them.&lt;/p&gt;

&lt;p&gt;The tempting move was to run it and move on. We did not do that. Before merging anything, we opened the actual rows and read them, the same way we would read the diff on a code change before shipping it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually sitting in the backlog
&lt;/h2&gt;

&lt;p&gt;The list was not what a clean prospect backlog should look like. It contained a federal .gov address belonging to a FOIA desk, two charity addresses, an immigration legal-aid nonprofit, a support inbox for a hosting platform, and a placeholder address left behind by a website-builder tool.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The row that stopped us&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One row in the backlog resolved to the founder's own email address. Had the merge run as planned, our own cold-email automation would have sent a prospecting email to its own founder.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;None of these rows were ever real prospects. They were the accumulated residue of however the original list had been built over time: a scrape, a form submission, a support ticket, an address typed into the wrong field once and never corrected. A list assembled this way does not announce which rows are bad. It just sits there looking like the rest of the data, until someone reads it closely enough to notice.&lt;/p&gt;

&lt;p&gt;A merge treats every row the same. It has no concept of "this one is a government agency" or "this one is us." Only a human looking at the actual data notices that some of those rows do not belong in an outreach queue at all, which is exactly why the step of looking cannot be automated away along with everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  A permanent filter, then the real migration
&lt;/h2&gt;

&lt;p&gt;Instead of merging the backlog as it was, we built a junk filter first: rules to catch government and military domains, our own company's own domains, known platform-support domains, and common nonprofit signals. Only after the filter existed did we run the actual migration.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Backlog rows&lt;/th&gt;
&lt;th&gt;Junk (filtered out)&lt;/th&gt;
&lt;th&gt;Already known&lt;/th&gt;
&lt;th&gt;Clean, migrated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;163&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The 2026-07-29 backlog migration, after the junk filter was in place.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Seven of 163 rows were junk by the filter's own rules. Thirty-three were contacts already known elsewhere in the pipeline. The remaining 123 were genuinely clean and migrated forward. The filter did not just catch the founder's own address. It caught six other rows an automation should never have been allowed to touch on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cheaper version of the same habit: look before you act
&lt;/h2&gt;

&lt;p&gt;Reading 163 rows by hand does not scale, and it was never meant to be the permanent answer. The filter is the durable version of the same instinct: instead of a human reading every row every time, a fixed set of rules reads them automatically and refuses to pass through anything that matches a known-bad pattern, before a single message goes out.&lt;/p&gt;

&lt;p&gt;The same habit shows up in a plainer form as a dry run: a mode where an automation reports exactly what it would do, to whom, and how many times, without actually doing it. A dry run over this backlog would have printed the founder's own address as a send target in plain text, which is a much cheaper way to catch the problem than finding out after the fact. Any automation that touches real addresses, real accounts, or real money is worth running once in a mode that only reports, before it is ever allowed to act.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails matter as much as retries
&lt;/h2&gt;

&lt;p&gt;Most of the engineering attention that goes into an automation goes into making it run reliably: retries, error handling, logging, alerts when something fails. All of that matters. None of it would have caught this. The problem here was not that the automation broke. It was that it was about to work exactly as designed, on data nobody had actually looked at.&lt;/p&gt;

&lt;p&gt;An automation inherits every defect already present in its inputs. "The list", whatever list it is, almost always contains something you would be embarrassed to act on automatically, because it was assembled over time by processes that were never built to guarantee it was clean. A gate that checks who an automation is about to touch, before it touches them, is not optional polish. It is as load-bearing as the retry logic everyone remembers to build.&lt;/p&gt;

&lt;p&gt;We keep this filter in place permanently now, on every list that feeds this pipeline, not just the one that happened to catch a founder's own inbox. The cost is a few seconds of automated checking before anything sends. The alternative, on a bad day, is an automation doing exactly what it was told to do, to exactly the wrong address.&lt;/p&gt;

&lt;p&gt;This is the same standard we hold any automation to, ours or one we build for someone else: before it runs unattended at volume, someone has actually looked at what it would touch, and a permanent check stands in that person's place going forward. A list is never as clean as it looks from the outside, and the automation running against it will not notice the difference on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions this post answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does an automated contact list need a human to look at it before it runs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because an automation inherits every defect already sitting in its input, and a list built up over time will always contain rows you would be embarrassed to act on automatically. In our case that meant a government address, charity contacts, and even the founder's own email, all queued for the same automated send.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What kind of "junk" ends up in a cold-outreach list?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Addresses that were never real prospects to begin with: government and institutional domains, nonprofit and charity contacts, platform support inboxes, placeholder addresses left over from tools like website builders, and occasionally an internal address that got swept in by accident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does a junk filter for an outreach automation actually check?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ours checks for gov and mil domains, our own company domains, known platform-support domains, and common nonprofit signals, and excludes any row that matches before it ever reaches the send queue. It runs before volume, not after a complaint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does inspecting the data before automating it slow things down?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It costs the time it takes to look. In our case that was one migration pass across 163 rows before anything moved. A dry run that prints what an automation would do, without doing it, costs the same small amount of time and catches the same problems before they become an actual send.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/the-junk-filter-that-caught-us-cold-emailing-our-founder" rel="noopener noreferrer"&gt;www.advai.cloud/blog/the-junk-filter-that-caught-us-cold-emailing-our-founder&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>datascience</category>
      <category>programming</category>
    </item>
    <item>
      <title>OCR document extraction for Philippine banks: what actually works</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Sat, 19 Sep 2026 11:04:53 +0000</pubDate>
      <link>https://dev.to/nova_solutions/ocr-document-extraction-for-philippine-banks-what-actually-works-33jc</link>
      <guid>https://dev.to/nova_solutions/ocr-document-extraction-for-philippine-banks-what-actually-works-33jc</guid>
      <description>&lt;p&gt;&lt;em&gt;A BIR Form 2316 printed by payroll software and a Torrens title issued in 1974 are not the same kind of document. Treating them as one is why production accuracy collapses.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two documents, two different problems
&lt;/h2&gt;

&lt;p&gt;A BIR Form 2316 printed by payroll software and a Torrens title issued in 1974 are not the same kind of document. Not the same OCR accuracy profile, not the same preprocessing pipeline, not the same confidence threshold before the data lands in a KYC record.&lt;/p&gt;

&lt;p&gt;The common pattern in Philippine bank OCR builds looks the same almost everywhere: scan or upload, run extraction, get a result. Demo accuracy looks fine, 88, 91, sometimes 94 percent. Then the system goes live. Failure patterns emerge that are specific to Philippine document types, completely predictable, and fixable, but only if you understand the problem before you build the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three-tier problem
&lt;/h2&gt;

&lt;p&gt;Before you write a line of OCR code, know this: your corpus splits into three tiers that need completely different treatment.&lt;/p&gt;

&lt;p&gt;Tier 1, machine-generated structured documents. BIR Form 2316, payslips from payroll software, system-generated PhilHealth MDR forms, GSIS UMID cards, passport MRZ zones. Fixed layout, printed text, consistent fonts, predictable field positions. With off-the-shelf tools you get 92 to 96 percent field-level accuracy on clean copies. "Clean copy" is doing a lot of work there: a 2316 folded three times, stapled to a payslip, and run through a flatbed scanner at 150 DPI is no longer clean. But for standard machine-generated versions, these are the most reliable documents in the stack. Build your happy path here.&lt;/p&gt;

&lt;p&gt;Tier 2, scanned handwritten forms. Loan applications from rural branches, income declarations filled by hand. Accuracy drops hard, 60 to 75 percent character-level without preprocessing. That sounds acceptable until you realize a 75 percent accurate extraction of a bank account number produces a garbage number that looks real. Invisible error, catastrophic record. Preprocessing, binarization, noise removal, deskew, handwriting-specific model selection, can push this to 82 to 88 percent on clean handwritten documents. You will never reach Tier 1 accuracy, which means Tier 2 needs a different verification architecture regardless of model quality.&lt;/p&gt;

&lt;p&gt;Tier 3, phone-photographed documents, where the most aggressive failure happens, and where the most volume is heading as banks add mobile onboarding. A phone photo of a Torrens title taken at an angle with a flash and a shadow across the bottom third: 40 percent accuracy baseline, maybe. Required preprocessing before any OCR: perspective correction, glare and shadow removal, contrast normalization, and resolution assessment with automatic rejection below 200 DPI equivalent. After that, accuracy on a clean government ID recovers to 78 to 88 percent. Still not Tier 1. Good enough for a first pass if you have human review flagging anything below threshold. Most deployments run the same model and threshold whether the input is a crisp 2316 or a phone photo of a 1982 title taken in Leyte. The demo number masks real production accuracy, which for banks with rural customers is often below 70 percent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What works well
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Philippine passports. The machine-readable zone is essentially 100 percent reliable with any decent OCR library. MRZ was engineered for automated reading. If your pipeline takes passport data, start there and treat it as ground truth.&lt;/li&gt;
&lt;li&gt;GSIS UMID cards. Consistent layout, machine-printed text, modern card stock. 90 to 95 percent field accuracy on clean captures, handled well out of the box.&lt;/li&gt;
&lt;li&gt;PhilHealth ID (post-2015 format). Same story as UMID. Fixed layout, machine-generated, high reliability.&lt;/li&gt;
&lt;li&gt;BIR Form 2316 (machine-generated copy). Once you have trained a layout model on the current template, fixed-position fields like gross compensation, tax withheld, and employer TIN extract at 92 to 96 percent. The highest-volume KYC document for employed borrowers and the clearest automation ROI in the stack.&lt;/li&gt;
&lt;li&gt;SSS ID (post-2019 biometric format). Reliable. Pre-2019 printed-card formats are Tier 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What does not work, and why
&lt;/h2&gt;

&lt;p&gt;These are the documents where vendors demo beautifully on curated samples and fail embarrassingly in your production queue. Handwritten loan application forms from rural branches: the problem is not just handwriting, it is that the forms vary between branches and years, with different field positions and handwriting from neat block letters to barely legible cursive. Photocopied Torrens titles with carbon copy layers: multiple generations of photocopying pile artifacts onto the text until characters are partially overwritten by scan noise. PSA birth certificates in older formats use typewriter fonts with varying ink density and faded toner, and the layout changed several times across decades. And a BIR 2316 the moment a human hand touches it drops from Tier 1 to Tier 2. No exceptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Torrens titles: their own category
&lt;/h2&gt;

&lt;p&gt;Torrens title extraction is a common place for vendor demos to look credible and then produce complete garbage in production. Torrens titles accumulate history physically. A title from 1965 may have handwritten margin annotations noting easements. The original TCT number may have been crossed out and replaced as lot partitioning occurred over decades. Stamps in Tagalog record registration. Owner names appear in Spanish-era conventions mixed with modern format. Carbon copy layers create ghost text sitting directly on top of primary content. That is all before physical condition: humidity damage, fold lines, edge fraying, faded ink. No off-the-shelf model was trained on this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preprocessing first. Deskew to correct rotational distortion, denoise to reduce scan artifacts, normalize contrast to pull faded text out of the background, and for carbon copy artifacts, a descreen filter to remove the moiré pattern from scanning a copy of a multipart form.&lt;/li&gt;
&lt;li&gt;Multi-zone parsing. The primary record area (TCT number, registered owner, lot and technical description) is structurally different from the margin annotations and the stamp area. A single unified model fails on all three. You need a zone detector that identifies which region it is reading, then applies the appropriate logic per zone.&lt;/li&gt;
&lt;li&gt;Human review for anything issued before 1985. Not a crutch, an architectural requirement. Quality variance for pre-1985 titles is too high to accept machine extraction without review. Getting a collateral document wrong in a loan file is not recoverable with a model update. Build the review queue from day one.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask any vendor demoing Torrens title OCR: what was the issuance year range of the titles in your test set, and what was your scan-quality selection criterion? If they cannot answer precisely, the accuracy number they are quoting is fiction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  BSP KYC compliance and the audit trail
&lt;/h2&gt;

&lt;p&gt;This is where most builds miss something that matters more than accuracy rates. BSP's KYC framework requires that customer identification and verification be auditable: you must demonstrate what data was collected, how it was verified, and who was responsible. For an automated pipeline that translates into three things you must build.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A confidence threshold, not just a confidence score. Every extraction produces a score; most teams look at it in logs. You need a hard threshold below which the extraction does not pass to the KYC record automatically and routes to human review. The threshold depends on document type and risk tolerance, but it must exist and be documented.&lt;/li&gt;
&lt;li&gt;A review queue integrated into the same application. The KYC officer sees extracted text alongside the original image, corrects errors, and confirms. Built into the runtime, not a spreadsheet or an email chain. Same application, same session, same record context, with the correction tracked as a discrete action by a named user.&lt;/li&gt;
&lt;li&gt;An immutable audit log. Every document gets a record: original extraction result, confidence score, whether it was auto-approved or reviewed, reviewer identity and timestamp, and any corrections. Append-only. BSP examiners will want to see this. "The system extracts it" is not an audit trail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is common to find OCR implementations with none of these three elements, even when the underlying accuracy metrics look good internally. An implementation like that would fail a compliance audit on the audit trail question alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical KYC stack for mid-size banks
&lt;/h2&gt;

&lt;p&gt;If you are a thrift, rural, or savings bank rather than BPI, BDO, or UnionBank scale, you do not need an enterprise OCR platform. You need something proportionate. Use a managed document AI service for structured government forms: 2316, PhilHealth ID, UMID, SSS ID, passports. High-volume, high-reliability, pre-built processors, low per-page cost. You are calling an API, not maintaining a model.&lt;/p&gt;

&lt;p&gt;Use a custom layout parser for Torrens titles and pre-standardization documents. This is where you need local development, not because the engineering is hard but because training data for Philippine Torrens titles in various conditions does not exist inside any US vendor's model. You need a team with access to real samples who can label them and understands the physical history of what they are looking at. Add a human review queue in the same web application: reviewer sees the image and extracted fields side by side, corrects, confirms, and confirmation writes to the audit log automatically.&lt;/p&gt;

&lt;p&gt;This stack handles 85 to 90 percent of KYC document volume automatically at most mid-size banks. The remaining 10 to 15 percent, complex titles, handwritten forms, damaged documents, routes to review without blocking the pipeline. A full enterprise OCR platform typically costs $40,000 to $150,000 annually for a mid-size deployment plus implementation. The managed-service-plus-custom-parser-plus-review-queue approach costs $800 to $3,000 per month in API fees plus a one-time build of ₱350,000 to ₱700,000 for the custom Torrens parser and review interface. For a bank processing 500 to 2,000 KYC documents per month, the pragmatic stack is both cheaper and better suited to the actual document mix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test set requirements before you go live
&lt;/h2&gt;

&lt;p&gt;Your pre-launch test set must come from your actual production corpus, not a curated demo set. That means titles from the 1960s and 1970s, not just recent ones. Handwritten loan forms from your rural branches, not just clean printed versions. Phone photographs taken under realistic branch lighting, not studio-quality captures. SSS IDs from 2008, not just 2024. Run your accuracy metrics on those. If your vendor's numbers collapse on real samples, you have found your actual production accuracy before it finds you.&lt;/p&gt;

&lt;p&gt;Test the failure modes explicitly too. What happens when a document is rotated 15 degrees? When a title has a hand-drawn border around a corrected field? When someone submits a screenshot of a PDF instead of the original scan? Your pipeline's behavior on bad input is as important as its accuracy on good input.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/ocr-document-extraction-philippine-banks" rel="noopener noreferrer"&gt;www.advai.cloud/blog/ocr-document-extraction-philippine-banks&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>computervision</category>
    </item>
    <item>
      <title>We audited our own indexing last month. We missed two of our own product pages.</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Sat, 19 Sep 2026 11:04:10 +0000</pubDate>
      <link>https://dev.to/nova_solutions/we-audited-our-own-indexing-last-month-we-missed-two-of-our-own-product-pages-3jnc</link>
      <guid>https://dev.to/nova_solutions/we-audited-our-own-indexing-last-month-we-missed-two-of-our-own-product-pages-3jnc</guid>
      <description>&lt;p&gt;&lt;em&gt;Publishing a fix and confirming it worked are two different steps. Last month we only did the first one.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We went back to check our own fix, not to look for something new
&lt;/h2&gt;

&lt;p&gt;Last month we wrote about a sitemap that gave a search engine no reason to recrawl 88 of our 103 pages, fixed it, and published the diagnosis. That post shipped, the fix shipped, and the natural next move is to consider the problem closed and turn to something else.&lt;/p&gt;

&lt;p&gt;We went back instead. Not because anything looked wrong, but because a fix that looks complete and a fix that has actually been verified against the live site are two different claims, and we had only made the first one. Opening the exact same Search Console report a month later, expecting a quiet confirmation, surfaced three separate problems the original pass never caught.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second, older version of the redirect bug we thought we had already fixed
&lt;/h2&gt;

&lt;p&gt;The August fix redirected a retired network of URLs, one folder deep under a /local/ path, to their current equivalents. It worked, and a spot check confirmed it. What that spot check did not surface was an even older version of the same URL pattern, one folder shallower, predating the one we had already caught, covering the same trades and the same cities.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The trap in checking your own redirect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A plain status check on these older URLs returned 308, a redirect, which reads as fixed. It was not. Following that redirect all the way through, rather than trusting the first response code, showed it landing on a page that itself returned 404. The first hop looked healthy. The destination did not exist.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fix was mechanical once found: the same trade-to-page mapping already proven correct for the newer network, applied to the older one, verified end to end this time rather than by status code alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  A page quietly declaring the wrong domain as its own canonical address
&lt;/h2&gt;

&lt;p&gt;One of our own trade pages showed up flagged as crawled but not indexed. Inspecting it directly in Search Console showed why: as of its last crawl, the page declared its own canonical URL on our bare domain, while every other page on the site, and the domain's own redirect rules, treat the www address as canonical. A page contradicting the site's own stated structure is exactly the kind of signal that makes a crawler hesitate.&lt;/p&gt;

&lt;p&gt;Checking the live page directly found the contradiction was already gone. Somewhere between that last crawl and today, the canonical tag had been corrected to match every other page on the site. Nothing needed fixing in the code. What was missing was simply a nudge back to the crawler that the page was worth looking at again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one that mattered most: two of our own product pages, never crawled
&lt;/h2&gt;

&lt;p&gt;The largest section of that report is pages a search engine has discovered through our sitemap but never visited at all. Thirty-four of them, as of this check. Most were pages that made sense to still be waiting their turn. Two were not: our own pages for roofing and for restaurants, live, correctly built, linked internally, present in the sitemap since launch, and never crawled a single time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are not new pages and this is not a new bug. It is the same root cause from last month's post, an authority and crawl-budget ceiling that has not moved, now fully counted rather than partially estimated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are not going to pretend a manual nudge to recrawl a handful of pages fixes that ceiling. It does not. What it does is keep the pages that are actually finished from sitting invisible while the underlying constraint, which is a separate and slower problem, gets worked on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we actually changed, and what we are not claiming
&lt;/h2&gt;

&lt;p&gt;We are not claiming any of this moved our search position. Nothing here has had time to show that yet, and we said the same thing last month for the same honest reason: isolating the effect of one fix takes longer than a same-day check allows.&lt;/p&gt;

&lt;p&gt;What changed is the process, not just the fix. Verifying that a fix landed is now its own explicit step, done by testing the live site directly rather than by trusting a report that may be describing a version of the site that no longer exists. A report that says something is broken is a claim about the past. The only way to know the present state is to go and look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions this post answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do you verify that a Search Console fix actually worked?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By live-testing the actual current behavior of the site, not by trusting the report. Search Console's indexing data reflects the last time a crawler visited a URL, which can be weeks or months old. A page can already be fixed in production while the report still shows the old, broken state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between Discovered and Crawled, currently not indexed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Discovered means a search engine knows a URL exists, usually from a sitemap, but has not visited it yet. Crawled means it visited and chose not to index what it found. Discovered is a queue problem. Crawled is closer to a quality or trust judgment, though it can also just mean the page changed since that one visit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a real, correctly built page simply never get crawled?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. A page can be live, linked internally, present in the sitemap, and completely correct, and still sit for months with zero crawls if a search engine has not allocated the budget to reach it. That allocation tracks a site's overall authority, not any single page's own quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does a canonical tag pointing at the wrong domain matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A canonical tag tells a search engine which URL is the authoritative version when more than one URL could serve the same content. If a page declares itself canonical at an address that immediately redirects elsewhere, that is a direct contradiction a crawler has to resolve, and the safest resolution for it is often to index neither version until the confusion clears.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/the-audit-we-should-have-run-the-first-time" rel="noopener noreferrer"&gt;www.advai.cloud/blog/the-audit-we-should-have-run-the-first-time&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Silent automation failures: how four of our own systems broke while reporting success</title>
      <dc:creator>Nova Solutions</dc:creator>
      <pubDate>Sun, 06 Sep 2026 10:29:14 +0000</pubDate>
      <link>https://dev.to/nova_solutions/silent-automation-failures-how-four-of-our-own-systems-broke-while-reporting-success-4jdm</link>
      <guid>https://dev.to/nova_solutions/silent-automation-failures-how-four-of-our-own-systems-broke-while-reporting-success-4jdm</guid>
      <description>&lt;p&gt;&lt;em&gt;Exit code zero means the process ran. It does not mean the work happened. We learned the difference four times in one week, on our own systems.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The embarrassing part first
&lt;/h2&gt;

&lt;p&gt;Our stack runs on automations we built ourselves: prospect list refueling, cold email, social posting, backend health checks, a morning briefing. For months, the monitoring on all of it was me occasionally remembering to check whether something had happened lately. The audit behind this post started with me admitting, in writing, that the only way I found out about broken automations was going and looking.&lt;/p&gt;

&lt;p&gt;We suspect most small-business automation is monitored the same way. Somebody wires a workflow, watches it succeed twice, and walks away. From that day on, the system reports whatever its happiest code path reports, and the owner finds out it died whenever they next happen to wonder about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four failures, zero alerts
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The 2026 audit of our own stack. Every row looked healthy from the outside.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Quiet for&lt;/th&gt;
&lt;th&gt;What it reported&lt;/th&gt;
&lt;th&gt;What was actually true&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cold email queue&lt;/td&gt;
&lt;td&gt;20 days&lt;/td&gt;
&lt;td&gt;Queue empty, clean exit&lt;/td&gt;
&lt;td&gt;A half-finished config change pointed the list builder at a file the sender had retired. About 130 verified prospects piled up in a file nothing read.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn posting&lt;/td&gt;
&lt;td&gt;18 days&lt;/td&gt;
&lt;td&gt;Offline, skipping run&lt;/td&gt;
&lt;td&gt;The connectivity check ran under a Python install with no certificate bundle. Every HTTPS probe failed certificate verification and a catch-all handler relabeled it offline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend failure alerts&lt;/td&gt;
&lt;td&gt;7+ weeks&lt;/td&gt;
&lt;td&gt;Nothing, by design&lt;/td&gt;
&lt;td&gt;Slack alerting for scheduled-job failures sat behind an environment flag nobody had set. A second, independent mute flag was stacked on top of it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Three scheduled scripts&lt;/td&gt;
&lt;td&gt;Intermittent&lt;/td&gt;
&lt;td&gt;Success, some days&lt;/td&gt;
&lt;td&gt;Under the scheduler's minimal environment, plain python3 sometimes resolved to a different interpreter without file access. Same script, different interpreter, different day.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every row shares the same shape. The process ran. The process exited cleanly. The process was wrong about the one thing it exists to do.&lt;/p&gt;

&lt;p&gt;The LinkedIn failure deserves a closer look, because it was built with good intentions. After a real outage, we added a connectivity check so the poster would skip runs while the network was down. That check happened to execute under a Python installation with no certificate authority bundle wired in, so every single HTTPS probe failed certificate verification. A broad exception handler caught the error and reported the network as offline. The safety check could never once pass. A guard that cannot distinguish the network is down from I am misconfigured will spend its life reporting the flattering one.&lt;/p&gt;

&lt;p&gt;The cold-email failure was even smaller: one line, half finished. The script that promotes verified prospects was updated to write to a new file one evening, and the sender that reads the queue was not updated to match. Both jobs kept running daily. Both kept exiting cleanly. One filled a file nothing read, the other read a file nothing filled and logged queue empty, for 20 days. Two healthy-looking automations, connected by a filename, doing nothing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tails lie&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The intermittent failure was the most instructive. The last few log lines looked clean, because recent runs happened to succeed. Only reading the full log, about three thousand lines back, showed success and failure alternating for weeks, which ruled out every theory that started with it broke on some particular day. The tail of a log shows the weather. The whole log shows the climate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why silent is the default, not the exception
&lt;/h2&gt;

&lt;p&gt;None of this is exotic, and none of it required unusual bad luck. Error handling gets written for the errors the author imagined, so the surprise arrives as a calm log line instead of a page. Schedulers know whether a process ran, not whether the work happened. Alert channels ship behind flags, and flags default to off. Each of these is a reasonable engineering choice on its own. Stacked together, they guarantee that the failure you did not imagine is exactly the one nobody hears about.&lt;/p&gt;

&lt;p&gt;The deeper problem is that no errors and working are different claims. A sender with an empty queue has no errors. A poster that believes it is offline has no errors. A muted alert system has, by definition, no errors. If your definition of healthy is the absence of red, a system can be dead for a month and stay green the whole time. Ours did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The proof-of-life rule we build to now
&lt;/h2&gt;

&lt;p&gt;Everything we wire now has to carry a signal tied to the outcome, not the process. The specific fixes from the audit took an afternoon each. The rules they left behind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assert the outcome, not the exit code. The email sender now checks the delivery count it actually achieved against the queue it believed it had. Zero sends on a day the queue says otherwise is an alert, not a log line.&lt;/li&gt;
&lt;li&gt;Alert on quiet, not just on error. If a system that normally does something daily does nothing for days, that silence should page a human, because silence is exactly what the worst failures produce.&lt;/li&gt;
&lt;li&gt;Un-mute by default. Alert switches that need a flag turned on will spend part of their life off without anyone having decided that. We found two of those stacked on one system.&lt;/li&gt;
&lt;li&gt;Pin the environment. Scheduled jobs get explicit interpreter paths and explicit certificate bundles. Whatever the environment resolves to is a different program on different days.&lt;/li&gt;
&lt;li&gt;Read the whole log once. The tail shows the weather. The full log shows the climate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to ask about your own automations
&lt;/h2&gt;

&lt;p&gt;If someone built automation for you, or you built it yourself, you can audit it without reading a line of code. Ask three questions of each automation you depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What number should move when this works, and where do I see it? If the answer is a log file, that is a no.&lt;/li&gt;
&lt;li&gt;Who finds out, and how fast, if that number stops moving?&lt;/li&gt;
&lt;li&gt;When did a human last confirm the outcome end to end, instead of the dashboard saying fine?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we build automations for a business now, the outcome signal and the alert wiring ship with the workflow, as part of the same job. Not because it is sophisticated. Because we watched four of our own systems fail quietly in one week, and quiet is the expensive kind of broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions this post answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I know if an automation is actually running?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not trust the exit code or the dashboard. Tie the automation to a number that should move when it works, a send count, a row count, a posted item, and check that number against what the system believed it would do. If the number and the belief disagree, or the number stops moving on a normal day, it is broken no matter how clean the logs look.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do automations fail silently instead of showing an error?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because most error handling only covers the failures the author imagined. Catch-all exception handlers convert surprises into calm log lines, schedulers only know whether a process ran, not whether the work happened, and alert channels are often muted behind configuration nobody set. Silence is the default failure mode of unattended systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a proof-of-life signal for an automation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A signal tied to the outcome the automation exists to produce, asserted every run and alarmed on absence: a delivery count that matches the queue, a heartbeat that fires only after real work completes, an alert when a normally daily system does nothing for days. Exit code zero is not proof of life; it only proves the process ran.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.advai.cloud/blog/silent-automation-failures" rel="noopener noreferrer"&gt;www.advai.cloud/blog/silent-automation-failures&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
