<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Deuts.NET</title>
	<atom:link href="https://deuts.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://deuts.net</link>
	<description>Personal rumblings on tech and stuff</description>
	<lastBuildDate>Thu, 09 Jul 2026 17:32:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://deuts.net/wp-content/uploads/2021/08/cropped-cropped-deuts.net_logo-32x32.jpg</url>
	<title>Deuts.NET</title>
	<link>https://deuts.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Publishing and Consuming OData Endpoints in Business Central Online</title>
		<link>https://deuts.net/2026/07/publishing-and-consuming-odata-endpoints-in-business-central-online/</link>
					<comments>https://deuts.net/2026/07/publishing-and-consuming-odata-endpoints-in-business-central-online/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Thu, 09 Jul 2026 17:29:55 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Business Central]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Power BI]]></category>
		<category><![CDATA[Power Query]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13181</guid>

					<description><![CDATA[When I first started integrating Microsoft Dynamics 365 Business Central with Excel, Power BI, and other tools, I was surprised by how little practical documentation there was on exposing existing pages as OData web services. Most articles focus on API pages or AL development, but if all you need is to expose a standard page &#8230; <a href="https://deuts.net/2026/07/publishing-and-consuming-odata-endpoints-in-business-central-online/" class="more-link">Continue reading <span class="screen-reader-text">Publishing and Consuming OData Endpoints in Business Central Online</span></a>]]></description>
										<content:encoded><![CDATA[<p class="PDq2pG_selectionAnchorContainer" data-start="71" data-end="488">When I first started integrating Microsoft Dynamics 365 Business Central with Excel, Power BI, and other tools, I was surprised by how little practical documentation there was on exposing existing pages as OData web services. Most articles focus on API pages or AL development, but if all you need is to expose a standard page like <strong data-start="403" data-end="428">Vendor Ledger Entries</strong> or <strong data-start="432" data-end="458">General Ledger Entries</strong>, the process is much simpler.</p>
<p data-start="490" data-end="628">This guide walks through the complete process, along with a troubleshooting section covering an issue that took several hours to diagnose.</p>
<p><span id="more-13181"></span></p>
<hr data-start="630" data-end="633" />
<h3 data-section-id="jdbqzm" data-start="635" data-end="668">Publishing an OData Web Service</h3>
<p data-start="670" data-end="777">Business Central allows any published <strong data-start="708" data-end="716">Page</strong> or <strong data-start="720" data-end="729">Query</strong> object to be exposed through an OData endpoint.</p>
<p data-start="779" data-end="791">Navigate to:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Search → Web Services</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="824" data-end="842">Create a new line:</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="844" data-end="994">
<thead data-start="844" data-end="861">
<tr data-start="844" data-end="861">
<th class="last:pe-10" data-start="844" data-end="852" data-col-size="sm">Field</th>
<th class="last:pe-10" data-start="852" data-end="861" data-col-size="sm">Value</th>
</tr>
</thead>
<tbody data-start="880" data-end="994">
<tr data-start="880" data-end="902">
<td data-start="880" data-end="894" data-col-size="sm">Object Type</td>
<td data-col-size="sm" data-start="894" data-end="902">Page</td>
</tr>
<tr data-start="903" data-end="928">
<td data-start="903" data-end="915" data-col-size="sm">Object ID</td>
<td data-start="915" data-end="928" data-col-size="sm">(Page ID)</td>
</tr>
<tr data-start="929" data-end="976">
<td data-start="929" data-end="944" data-col-size="sm">Service Name</td>
<td data-col-size="sm" data-start="944" data-end="976">Your preferred endpoint name</td>
</tr>
<tr data-start="977" data-end="994">
<td data-start="977" data-end="989" data-col-size="sm">Published</td>
<td data-start="989" data-end="994" data-col-size="sm">✓</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="996" data-end="1008">For example:</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="1010" data-end="1172">
<thead data-start="1010" data-end="1052">
<tr data-start="1010" data-end="1052">
<th class="last:pe-10" data-start="1010" data-end="1024" data-col-size="sm">Object Type</th>
<th class="last:pe-10" data-start="1024" data-end="1036" data-col-size="sm">Object ID</th>
<th class="last:pe-10" data-start="1036" data-end="1052" data-col-size="sm">Service Name</th>
</tr>
</thead>
<tbody data-start="1096" data-end="1172">
<tr data-start="1096" data-end="1134">
<td data-start="1096" data-end="1103" data-col-size="sm">Page</td>
<td data-start="1103" data-end="1108" data-col-size="sm">20</td>
<td data-col-size="sm" data-start="1108" data-end="1134">General_Ledger_Entries</td>
</tr>
<tr data-start="1135" data-end="1172">
<td data-start="1135" data-end="1142" data-col-size="sm">Page</td>
<td data-col-size="sm" data-start="1142" data-end="1147">29</td>
<td data-col-size="sm" data-start="1147" data-end="1172">Vendor_Ledger_Entries</td>
</tr>
</tbody>
</table>
</div>
</div>
<p data-start="1174" data-end="1247">Once published, the endpoint becomes immediately available through OData.</p>
<hr data-start="1249" data-end="1252" />
<h3 data-section-id="1qm5dxg" data-start="1254" data-end="1275">Finding the Page ID</h3>
<p data-start="1277" data-end="1381">The easiest way to determine the Page ID is from the URL while viewing the page inside Business Central.</p>
<p data-start="1383" data-end="1395">For example:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://businesscentral.dynamics.com/&lt;tenant&gt;/Production/?company=AM60%20Property%20Trust&amp;page=20</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1504" data-end="1526">The important part is:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>page=20</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1545" data-end="1579">meaning the object is <strong data-start="1567" data-end="1578">Page 20</strong>.</p>
<p data-start="1581" data-end="1597">Another example:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://businesscentral.dynamics.com/&lt;tenant&gt;/Production/?company=AM60%20Property%20Trust&amp;page=29</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1706" data-end="1711">Here,</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>page=29</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="1730" data-end="1771">corresponds to <strong data-start="1745" data-end="1770">Vendor Ledger Entries</strong>.</p>
<p data-start="1773" data-end="1836">This works for most standard pages throughout Business Central.</p>
<hr data-start="1838" data-end="1841" />
<h3 data-section-id="1pwpo5a" data-start="1843" data-end="1871">Constructing the OData URL</h3>
<p data-start="1873" data-end="1896">The endpoint format is:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://api.businesscentral.dynamics.com/v2.0/&lt;tenant&gt;/&lt;environment&gt;/ODataV4/Company('&lt;company&gt;')/&lt;service-name&gt;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2024" data-end="2032">Example:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>https://api.businesscentral.dynamics.com/v2.0/e7509dc1-fefb-4789-8563-7df05946f26e/Production/ODataV4/Company('AM60%20Property%20Trust')/Vendor_Ledger_Entries</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2206" data-end="2287">Notice that the endpoint uses the <strong data-start="2240" data-end="2256">Service Name</strong>, not the page name or page ID.</p>
<hr data-start="2289" data-end="2292" />
<h3 data-section-id="19zb2xl" data-start="2294" data-end="2317">Connecting from Excel</h3>
<p data-start="2319" data-end="2328">In Excel:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>Data
→ Get Data
→ From Other Sources
→ From OData Feed</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2394" data-end="2417">Enter the endpoint URL.</p>
<p data-start="2419" data-end="2452">When prompted for authentication:</p>
<ul data-start="2454" data-end="2532">
<li data-section-id="16snkyq" data-start="2454" data-end="2489">Choose <strong data-start="2463" data-end="2489">Organizational Account</strong></li>
<li data-section-id="1w0v7ke" data-start="2490" data-end="2532">Sign in using your Microsoft 365 account</li>
</ul>
<p data-start="2534" data-end="2638">Business Central Online no longer supports Web Service Access Keys, so OAuth authentication is required.</p>
<hr data-start="2640" data-end="2643" />
<h3 data-section-id="k033i2" data-start="2645" data-end="2671">Connecting from Power BI</h3>
<p data-start="2673" data-end="2711">Power BI uses the same OData endpoint.</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="relative h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute inset-x-4 top-12 bottom-4">
<div class="pointer-events-none sticky z-40 shrink-0 z-1!">
<div class="sticky bg-token-border-light"></div>
</div>
</div>
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="">
<div class="relative">
<div class="">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>let
    Source =
        OData.Feed(
            "https://api.businesscentral.dynamics.com/v2.0/&lt;tenant&gt;/&lt;environment&gt;/ODataV4/Company('AM60%20Property%20Trust')/Vendor_Ledger_Entries",
            null,
            [Implementation="2.0"]
        )
in
    Source</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p data-start="2995" data-end="3032">The same M query also works in Excel.</p>
<hr data-start="3034" data-end="3037" />
<h3 data-section-id="1kz8o7y" data-start="3039" data-end="3056">Troubleshooting</h3>
<h4 data-section-id="elr7oy" data-start="3058" data-end="3095">&#8220;The odata.context url is invalid&#8221;</h4>
<p data-start="3097" data-end="3188">One issue I encountered after publishing new web services was the following error in Excel:</p>
<div class="relative w-full mt-4 mb-1">
<div class="">
<div class="contents">
<div class="relative">
<div class="h-full min-h-0 min-w-0">
<div class="h-full min-h-0 min-w-0">
<div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl">
<div class="h-full w-full border-radius-3xl bg-(--code-block-surface) corner-superellipse/1.1 overflow-clip rounded-3xl [--code-block-surface:var(--bg-elevated-secondary)] dark:[--code-block-surface:var(--composer-surface-primary)] lxnfua_clipPathFallback">
<div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div>
<div class="relative">
<div class="pe-11 pt-3">
<div class="relative z-0 flex max-w-full">
<div id="code-block-viewer" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼs ͼ16" dir="ltr">
<div class="cm-scroller">
<pre class="cm-content q9tKkq_readonly m-0"><code>DataFormat.Error:
The odata.context url
'https://.../$metadata#Company('ABC%20Company%20Inc')/GLEntriesTest'
is invalid</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<div class=""></div>
</div>
</div>
</div>
</div>
</div>
<p data-start="3327" data-end="3341">Interestingly:</p>
<ul data-start="3343" data-end="3535">
<li data-section-id="6b9644" data-start="3343" data-end="3385">Existing web services continued to work.</li>
<li data-section-id="1wtz8ga" data-start="3386" data-end="3424">Newly published web services failed.</li>
<li data-section-id="1vz0n2n" data-start="3425" data-end="3475">Power BI loaded the same endpoints successfully.</li>
<li data-section-id="1mrvafm" data-start="3476" data-end="3535">Excel Online also loaded the same endpoints successfully.</li>
</ul>
<p data-start="3537" data-end="3672">Initially this looked like a Business Central problem, but after a lengthy investigation, the issue turned out to be on the Excel side.</p>
<h3 data-section-id="1ap8aco" data-start="3674" data-end="3688">Resolution</h3>
<p data-start="3690" data-end="3777">Clearing permissions from <strong data-start="3716" data-end="3753">Excel&#8217;s main Data Source Settings</strong> was <strong data-start="3758" data-end="3776">not sufficient</strong>.</p>
<p data-start="3779" data-end="3805">The issue was resolved by:</p>
<ol data-start="3807" data-end="4013">
<li data-section-id="c7g7tg" data-start="3807" data-end="3841">Opening <strong data-start="3818" data-end="3840">Power Query Editor</strong>.</li>
<li data-section-id="1j2shog" data-start="3842" data-end="3901">Opening <strong data-start="3853" data-end="3877">Data Source Settings</strong> from within the editor.</li>
<li data-section-id="1y8c5xi" data-start="3902" data-end="3959">Clearing the Business Central data source permissions.</li>
<li data-section-id="1cfuie7" data-start="3960" data-end="4013">Reauthenticating using <strong data-start="3986" data-end="4012">Organizational Account</strong>.</li>
</ol>
<p data-start="4015" data-end="4083">After doing this, the newly published web services loaded correctly.</p>
<p data-start="4085" data-end="4256">If you encounter the same error after publishing new OData services, this should be one of the first things you try before assuming there&#8217;s an issue with Business Central.</p>
<hr data-start="4258" data-end="4261" />
<h3 data-section-id="1nnattq" data-start="4263" data-end="4285">A Few Practical Tips</h3>
<ul data-start="4287" data-end="4766">
<li data-section-id="1fwciis" data-start="4287" data-end="4392">Use descriptive service names. These become part of the URL and make integrations easier to understand.</li>
<li data-section-id="1tzp833" data-start="4393" data-end="4477">Prefer exposing only the pages you actually need instead of publishing everything.</li>
<li data-section-id="19foyg0" data-start="4478" data-end="4596">If you&#8217;re building reports in Power BI, the same endpoints can usually be reused in Excel and other OData consumers.</li>
<li data-section-id="byyiug" data-start="4597" data-end="4766">If a newly published service doesn&#8217;t load in Excel but works elsewhere, clear the Power Query data source permissions before spending hours debugging Business Central.</li>
</ul>
<hr data-start="4768" data-end="4771" />
<p data-start="4773" data-end="5070" data-is-last-node="" data-is-only-node="">Publishing standard Business Central pages as OData web services is surprisingly straightforward once you know where to look. Hopefully this saves someone else the several hours of troubleshooting it took me to discover that the problem wasn&#8217;t the endpoint at all—it was a stale Power Query cache.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/07/publishing-and-consuming-odata-endpoints-in-business-central-online/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mimo 2.5 Didn&#8217;t Just Make Mistakes. It Changed How I Evaluate AI Models.</title>
		<link>https://deuts.net/2026/07/mimo-2-5-didnt-just-make-mistakes-it-changed-how-i-evaluate-ai-models/</link>
					<comments>https://deuts.net/2026/07/mimo-2-5-didnt-just-make-mistakes-it-changed-how-i-evaluate-ai-models/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 02:45:42 +0000</pubDate>
				<category><![CDATA[AI & Automation]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Mimo]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13180</guid>

					<description><![CDATA[For the past few weeks, I&#8217;ve been building and experimenting with AI agents. Not just chatbots, but agents that search the web, modify files, interact with Linux terminals, schedule cron jobs, orchestrate MCP tools, and automate real work. Like many people, I initially evaluated models using the usual metrics: Benchmark scores Coding ability Reasoning capability &#8230; <a href="https://deuts.net/2026/07/mimo-2-5-didnt-just-make-mistakes-it-changed-how-i-evaluate-ai-models/" class="more-link">Continue reading <span class="screen-reader-text">Mimo 2.5 Didn&#8217;t Just Make Mistakes. It Changed How I Evaluate AI Models.</span></a>]]></description>
										<content:encoded><![CDATA[<p>For the past few weeks, I&#8217;ve been building and experimenting with AI agents.</p>
<p>Not just chatbots, but agents that search the web, modify files, interact with Linux terminals, schedule cron jobs, orchestrate MCP tools, and automate real work.</p>
<p>Like many people, I initially evaluated models using the usual metrics:</p>
<ul>
<li>Benchmark scores</li>
<li>Coding ability</li>
<li>Reasoning capability</li>
<li>Context window</li>
<li>Cost</li>
<li>Speed</li>
</ul>
<p>Those metrics are useful.</p>
<p>But after spending enough time with autonomous agents, I&#8217;ve come to believe they don&#8217;t measure the thing I care about most.</p>
<p><strong>Operational reliability.</strong><span id="more-13180"></span></p>
<h2>The morning that changed my mind</h2>
<p>Recently I was using <strong>Mimo 2.5</strong> as the reasoning model behind my Hermes agent.</p>
<p>Within the span of about an hour, I encountered three separate incidents that completely changed how I think AI models should be evaluated.</p>
<p>None of them were catastrophic.</p>
<p>None of them involved complex reasoning.</p>
<p>Yet all three exposed behaviors that would concern me far more than a low benchmark score.</p>
<hr />
<h2>Incident 1 — A timezone that wasn&#8217;t</h2>
<p>My Linux server reported:</p>
<pre><code class="language-text">Time zone: Asia/Manila (PST, +0800)
</code></pre>
<p>The model interpreted <strong>PST</strong> as <strong>Pacific Standard Time</strong> instead of <strong>Philippine Standard Time</strong>.</p>
<p>It ignored the authoritative information immediately beside it:</p>
<ul>
<li><code>Asia/Manila</code></li>
<li><code>+0800</code></li>
</ul>
<p>From that single incorrect assumption, it concluded:</p>
<ul>
<li>my server was running in Pacific Time,</li>
<li>cron jobs would execute 16 hours differently,</li>
<li>reminders would trigger at unexpected times,</li>
<li>I should reconfigure the server&#8217;s timezone.</li>
</ul>
<p>The interesting part wasn&#8217;t the mistake.</p>
<p>The interesting part was how confidently the rest of the reasoning grew from that incorrect assumption.</p>
<hr />
<h2>Incident 2 — Correcting me before checking</h2>
<p>Later we were discussing Wimbledon.</p>
<p>The model stated that Barbora Krejčíková was the defending champion.</p>
<p>I questioned it.</p>
<p>Instead of checking the web—despite having web search available—it confidently explained why I was mistaken.</p>
<p>Only after I supplied the official Wimbledon website did it search, verify the facts, and admit that I had been right.</p>
<p>The problem wasn&#8217;t that it got a tennis fact wrong.</p>
<p>The problem was the sequence.</p>
<p>Instead of:</p>
<p><strong>Verify → Respond</strong></p>
<p>it followed:</p>
<p><strong>Respond → Verify</strong></p>
<p>For sports trivia, that&#8217;s annoying.</p>
<p>For an autonomous agent managing infrastructure or financial systems, that&#8217;s a much bigger concern.</p>
<hr />
<h2>Incident 3 — A source that never said it</h2>
<p>Curious about what had happened, I asked the model what search result originally led it to believe Krejčíková was the defending champion.</p>
<p>It replied that an ESPN article contained the phrase:</p>
<blockquote><p>&#8220;guarantees new Wimbledon champion&#8221;</p></blockquote>
<p>I asked for the link.</p>
<p>It found the ESPN article.</p>
<p>I opened it.</p>
<p>The phrase wasn&#8217;t there.</p>
<p>When I pointed this out, the model admitted that it had conflated multiple sources and incorrectly attributed the wording to ESPN.</p>
<p>Again, this wasn&#8217;t merely a factual mistake.</p>
<p>It was a failure of source attribution.</p>
<hr />
<h2>None of these incidents were extraordinary</h2>
<p>Every frontier model makes mistakes.</p>
<p>I&#8217;ve seen factual errors from multiple models.</p>
<p>That&#8217;s not the point.</p>
<p>What caught my attention was that all three incidents followed the same behavioral pattern.</p>
<p>The model tended to:</p>
<ul>
<li>make an early assumption,</li>
<li>express it confidently,</li>
<li>build additional reasoning on top of it,</li>
<li>verify only after being challenged.</li>
</ul>
<p>That pattern is much more important than whether the original mistake involved Linux, sports, or something else.</p>
<hr />
<h2>Is this a Mimo 2.5 problem?</h2>
<p>Not necessarily.</p>
<p>These incidents all occurred while I was using <strong>Mimo 2.5</strong>, so it&#8217;s fair to document them as observations from that model.</p>
<p>However, I don&#8217;t think it&#8217;s intellectually honest to conclude from a handful of incidents that Mimo 2.5 is categorically worse than every competing model.</p>
<p>I&#8217;ve seen similar behaviors—though not always with the same frequency—from other modern LLMs.</p>
<p>The takeaway isn&#8217;t:</p>
<blockquote><p>&#8220;Mimo 2.5 is bad.&#8221;</p></blockquote>
<p>The takeaway is:</p>
<blockquote><p><strong>Operational reliability deserves to be evaluated independently from intelligence.</strong></p></blockquote>
<p>Those are two different qualities.</p>
<hr />
<h2>Benchmarks don&#8217;t measure this</h2>
<p>Traditional benchmarks answer questions like:</p>
<ul>
<li>Can the model solve this problem?</li>
<li>Can it write this code?</li>
<li>Can it answer this question?</li>
</ul>
<p>What they rarely measure is:</p>
<ul>
<li>Does the model know when it might be wrong?</li>
<li>Does it verify before disagreeing?</li>
<li>Does it use available tools appropriately?</li>
<li>Does it recognize authoritative evidence?</li>
<li>Does it revise its beliefs when new information appears?</li>
<li>Does it attribute information to the correct source?</li>
</ul>
<p>Those questions matter far more once an AI starts acting autonomously.</p>
<hr />
<h2>From bug log to incident database</h2>
<p>These incidents convinced me to stop keeping ad hoc notes.</p>
<p>Instead, I&#8217;m building an <strong>AI Agent Reliability Database</strong>.</p>
<p>Rather than recording isolated mistakes, I&#8217;m documenting <strong>failure patterns</strong>.</p>
<p>Examples include:</p>
<ul>
<li>Anchored on ambiguous terminology</li>
<li>Corrected the user before verification</li>
<li>Failed to verify assumptions</li>
<li>Ignored authoritative evidence</li>
<li>Preferred internal memory over available tools</li>
<li>Incorrect source attribution</li>
<li>Overconfidence despite uncertainty</li>
</ul>
<p>Each incident links to one or more reusable patterns.</p>
<p>That way, if a future model exhibits the same behavior, I can compare it objectively rather than relying on memory or anecdotes.</p>
<hr />
<h2>Engineering can mitigate many of these problems</h2>
<p>One unexpected lesson is that many reliability issues aren&#8217;t solved by changing models.</p>
<p>They&#8217;re solved by improving the surrounding system.</p>
<p>For example:</p>
<ul>
<li>Pass IANA timezone identifiers (<code>Asia/Manila</code>) instead of ambiguous abbreviations like <code>PST</code>.</li>
<li>Provide structured data instead of free-form text.</li>
<li>Require verification before contradicting the user.</li>
<li>Let deterministic software perform scheduling and time calculations.</li>
<li>Prefer authoritative sources whenever tools are available.</li>
</ul>
<p>Good orchestration reduces the opportunity for language models to make reasoning mistakes.</p>
<hr />
<h2>A different way to evaluate AI</h2>
<p>I&#8217;ve become less interested in asking:</p>
<blockquote><p>&#8220;Which model is the smartest?&#8221;</p></blockquote>
<p>Instead, I&#8217;m asking:</p>
<ul>
<li>Which model is the easiest to trust?</li>
<li>Which one verifies before acting?</li>
<li>Which one admits uncertainty appropriately?</li>
<li>Which one recovers gracefully after making a mistake?</li>
<li>Which one behaves predictably in autonomous workflows?</li>
</ul>
<p>Those aren&#8217;t benchmark questions.</p>
<p>But I suspect they&#8217;ll become some of the most important questions as AI agents move from demonstrations to production systems.</p>
<p>And ironically, I have <strong>Mimo 2.5</strong> to thank for making me realize that.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/07/mimo-2-5-didnt-just-make-mistakes-it-changed-how-i-evaluate-ai-models/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Why OpenCode Go Is Worth It — An Honest Take for Coders and Automators</title>
		<link>https://deuts.net/2026/07/why-opencode-go-is-worth-it-an-honest-take-for-coders-and-automators/</link>
					<comments>https://deuts.net/2026/07/why-opencode-go-is-worth-it-an-honest-take-for-coders-and-automators/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Sun, 05 Jul 2026 11:36:06 +0000</pubDate>
				<category><![CDATA[AI & Automation]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Deepseek]]></category>
		<category><![CDATA[Mimo]]></category>
		<category><![CDATA[Opencode]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13176</guid>

					<description><![CDATA[I&#8217;ve been using OpenCode Go for about two weeks now, and it&#8217;s become my go-to for coding, AI agents, and automation. Here&#8217;s an honest take on whether it&#8217;s worth it. What Is OpenCode Go? A $5 first month, $10/month after subscription that gives you access to 13 top open coding models. No per-token charges — &#8230; <a href="https://deuts.net/2026/07/why-opencode-go-is-worth-it-an-honest-take-for-coders-and-automators/" class="more-link">Continue reading <span class="screen-reader-text">Why OpenCode Go Is Worth It — An Honest Take for Coders and Automators</span></a>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">I&#8217;ve been using <strong>OpenCode Go</strong> for about two weeks now, and it&#8217;s become my go-to for coding, AI agents, and automation. Here&#8217;s an honest take on whether it&#8217;s worth it.</p>


<h2 class="wp-block-heading">What Is OpenCode Go?</h2>


<p class="wp-block-paragraph">A <strong>$5 first month, $10/month after</strong> subscription that gives you access to 13 top open coding models. No per-token charges — just a flat fee with usage limits.</p>

<p class="wp-block-paragraph"><a href="https://opencode.ai/go?ref=EKAB1CGWWG">Subscribe to OpenCode Go</a></p>


<h2 class="wp-block-heading">The Models</h2>



<ul class="wp-block-list">
<li><strong>DeepSeek</strong> — V4 Pro, V4 Flash</li>
<li><strong>GLM</strong> — 5.2, 5.1</li>
<li><strong>Kimi</strong> — K2.7 Code, K2.6</li>
<li><strong>Qwen</strong> — 3.7 Max, 3.7 Plus, 3.6 Plus</li>
<li><strong>MiniMax</strong> — M3, M2.7</li>
<li><strong>MiMo</strong> — V2.5, V2.5 Pro (with vision!)</li>
</ul>

<span id="more-13176"></span>



<h2 class="wp-block-heading">How I Use It</h2>


<p class="wp-block-paragraph">Three tools, one subscription:</p>


<ul class="wp-block-list">
<li><strong>OpenCode</strong> — terminal coding agent. MiMo V2.5 Pro scored 83/100 on benchmarks, beating Claude Opus on agentic tasks.</li>
<li><strong>Hermes</strong> — my AI agent on Telegram. Uses OpenCode Go as its provider, so it has access to 13 models for $10/month.</li>
<li><strong>n8n</strong> — workflow automation. OpenCode Go works as an OpenAI-compatible endpoint, so you can build AI workflows without per-token costs.</li>
</ul>



<h2 class="wp-block-heading">The Honest Math</h2>


<p class="wp-block-paragraph">Here&#8217;s where I need to be real: <strong>the monthly budget is the real constraint</strong>, not the 5-hour window.</p>

<p class="wp-block-paragraph">The limits are:</p>


<ul class="wp-block-list">
<li>5-hour window: $12 budget equivalent</li>
<li>Weekly: $30 budget equivalent</li>
<li><strong>Monthly: $60 budget equivalent</strong></li>
</ul>


<p class="wp-block-paragraph">If you max out the 5-hour window, you&#8217;ve burned 20% of your monthly cap in one session. Do that a few times and you&#8217;re looking at the monthly limit fast. The 5-hour window sounds generous, but it&#8217;s really just a throttle — the monthly cap is what matters.</p>

<p class="wp-block-paragraph">For light-to-moderate use (a few coding sessions, some agent queries, occasional automation), the monthly cap is plenty. But if you&#8217;re running heavy agentic workflows or long coding sessions daily, you&#8217;ll feel it.</p>


<h2 class="wp-block-heading">What $10 Gets You vs Pay-As-You-Go</h2>


<p class="wp-block-paragraph">The value is still there — just not unlimited:</p>


<ul class="wp-block-list">
<li>MiMo V2.5 Pro at Zen API rates: ~$1.74/1M input. The subscription gives you ~3,000 requests per 5h for $10/month flat.</li>
<li>DeepSeek V4 Flash: ~$0.14/1M input. Budget-friendly but still draws from the same monthly pool.</li>
<li>You&#8217;re getting <strong>20-60x more value</strong> than pay-as-you-go for moderate usage.</li>
</ul>



<h2 class="wp-block-heading">My Verdict</h2>


<p class="wp-block-paragraph">Worth it if you:</p>


<ul class="wp-block-list">
<li>Use AI tools regularly but not excessively</li>
<li>Want to try 13 models without per-token costs</li>
<li>Run AI agents or automations that need reliable access</li>
<li>Want flat pricing with no surprise bills</li>
</ul>


<p class="wp-block-paragraph">Might not be worth it if you max out the 5-hour window regularly — you&#8217;ll hit the monthly cap and need to wait or top up credits.</p>


<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://opencode.ai/go?ref=EKAB1CGWWG">Try OpenCode Go — $5 First Month</a></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/07/why-opencode-go-is-worth-it-an-honest-take-for-coders-and-automators/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress MCP Setup for Claude Code</title>
		<link>https://deuts.net/2026/06/wordpress-mcp-setup-for-claude-code/</link>
					<comments>https://deuts.net/2026/06/wordpress-mcp-setup-for-claude-code/#respond</comments>
		
		<dc:creator><![CDATA[Claude]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 17:22:55 +0000</pubDate>
				<category><![CDATA[AI & Automation]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13171</guid>

					<description><![CDATA[The WordPress MCP Adapter plugin exposes a WordPress site as an MCP server. Combined with Automattic&#8217;s @automattic/mcp-wordpress-remote package, Claude Code can create and edit posts, manage pages, and interact with WordPress directly from a session. Architecture Claude Code └── stdio └── npx @automattic/mcp-wordpress-remote └── HTTPS (Application Password auth) └── WordPress REST API (/wp-json/mcp/...) └── MCP &#8230; <a href="https://deuts.net/2026/06/wordpress-mcp-setup-for-claude-code/" class="more-link">Continue reading <span class="screen-reader-text">WordPress MCP Setup for Claude Code</span></a>]]></description>
										<content:encoded><![CDATA[<p>The <a href="https://github.com/WordPress/mcp-adapter">WordPress MCP Adapter plugin</a> exposes a WordPress site as an MCP server. Combined with Automattic&#8217;s <code>@automattic/mcp-wordpress-remote</code> package, Claude Code can create and edit posts, manage pages, and interact with WordPress directly from a session.</p>
<h2>Architecture</h2>
<pre><code>Claude Code
  └── stdio
      └── npx @automattic/mcp-wordpress-remote
              └── HTTPS (Application Password auth)
                      └── WordPress REST API (/wp-json/mcp/...)
                              └── MCP Adapter plugin
                                      └── WordPress Abilities API</code></pre>
<h2>Requirements</h2>
<ul>
<li>WordPress 6.9+</li>
<li>Node.js (installed via nvm)</li>
<li>MCP Adapter plugin activated on the WordPress site</li>
</ul>
<p><span id="more-13171"></span></p>
<h2>Step 1: Install the MCP Adapter Plugin</h2>
<p>Via WP-CLI on the server:</p>
<pre><code>wp plugin install https://github.com/WordPress/mcp-adapter/releases/latest/download/mcp-adapter.zip --activate</code></pre>
<p>Or install manually from the GitHub releases page and activate in WP Admin → Plugins. Once active, the following REST API routes should be present:</p>
<pre><code>/wp-json/mcp/
/wp-json/mcp/mcp-adapter-default-server</code></pre>
<h2>Step 2: Create a WordPress Application Password</h2>
<ol>
<li>Log into WP Admin → Users → Profile</li>
<li>Scroll to <strong>Application Passwords</strong></li>
<li>Enter a name (e.g. <code>claude-code</code>) and click <strong>Add New Application Password</strong></li>
<li>Copy the generated password — it is shown only once</li>
</ol>
<h2>Step 3: Install Node.js via nvm</h2>
<pre><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.nvm/nvm.sh
nvm install --lts</code></pre>
<h2>Step 4: Add the MCP Server to ~/.claude.json</h2>
<p>Add the following under <code>mcpServers</code> in <code>~/.claude.json</code>:</p>
<pre><code>{
  "wordpress": {
    "type": "stdio",
    "command": "/home/user/.nvm/versions/node/v24.x.x/bin/npx",
    "args": ["@automattic/mcp-wordpress-remote"],
    "env": {
      "WP_API_USERNAME": "your-wp-username",
      "WP_API_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
      "WP_API_URL": "https://yourdomain.com/wp-json/mcp/mcp-adapter-default-server",
      "PATH": "/home/user/.nvm/versions/node/v24.x.x/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    }
  }
}</code></pre>
<p>Two critical details:</p>
<ul>
<li><strong><code>WP_API_URL</code> must be the full endpoint path</strong>, not a bare domain. Passing just <code>https://yourdomain.com</code> triggers legacy mode in the package, which targets the deprecated <code>/wp-json/wp/v2/wpmcp</code> endpoint and returns a 404.</li>
<li><strong><code>PATH</code> must include the nvm Node path</strong>. Claude Code sessions do not source <code>.bashrc</code> or nvm, so without this, npx fails with <code>env: 'node': No such file or directory</code>.</li>
</ul>
<p>Note: XML-RPC (<code>/xmlrpc.php</code>) is not used — the MCP Adapter uses the REST API exclusively. It can stay disabled.</p>
<h2>Step 5: Restart Claude Code and Verify</h2>
<p>MCP servers connect at session startup. After editing <code>~/.claude.json</code>, start a new session. To verify the endpoint is reachable beforehand:</p>
<pre><code>curl -s https://yourdomain.com/wp-json/mcp/ | python3 -m json.tool</code></pre>
<p>Should list <code>/mcp</code> and <code>/mcp/mcp-adapter-default-server</code> routes. Once connected, WordPress tools will appear alongside any other MCP tools in the session.</p>
<h2>Notes</h2>
<ul>
<li>The <code>@automattic/mcp-wordpress-remote</code> package is downloaded on first use by npx and cached in <code>~/.npm/</code>.</li>
<li>For additional WordPress sites, add new entries under <code>mcpServers</code> with different keys (e.g. <code>wordpress-staging</code>).</li>
<li>MCP servers only connect at session start — always start a new Claude Code session after changing MCP configuration.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/06/wordpress-mcp-setup-for-claude-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Setting Up Mnemosyne Memory for Claude Code</title>
		<link>https://deuts.net/2026/06/setting-up-mnemosyne-memory-for-claude-code/</link>
					<comments>https://deuts.net/2026/06/setting-up-mnemosyne-memory-for-claude-code/#respond</comments>
		
		<dc:creator><![CDATA[Claude]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 17:21:42 +0000</pubDate>
				<category><![CDATA[AI & Automation]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MCP]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13170</guid>

					<description><![CDATA[Mnemosyne is a local-first AI memory system that integrates with Claude Code via MCP, giving Claude persistent memory across sessions. Why MCP Instead of CLI The CLI (mnemosyne store, mnemosyne recall) is a manual tool — you run it yourself and paste results back. The MCP integration makes Mnemosyne a first-class tool Claude can call &#8230; <a href="https://deuts.net/2026/06/setting-up-mnemosyne-memory-for-claude-code/" class="more-link">Continue reading <span class="screen-reader-text">Setting Up Mnemosyne Memory for Claude Code</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="https://github.com/AxDSan/mnemosyne">Mnemosyne</a> is a local-first AI memory system that integrates with Claude Code via MCP, giving Claude persistent memory across sessions.</p>
<h2>Why MCP Instead of CLI</h2>
<p>The CLI (<code>mnemosyne store</code>, <code>mnemosyne recall</code>) is a manual tool — you run it yourself and paste results back. The MCP integration makes Mnemosyne a <strong>first-class tool Claude can call directly</strong>, just like any other tool in a session.</p>
<p>Concretely, with MCP:</p>
<ul>
<li>Claude automatically stores and retrieves memories during a conversation without any manual intervention</li>
<li>Memory reads and writes happen inline, so context is enriched transparently</li>
<li>No copy-pasting: Claude calls <code>mnemosyne_remember</code> or <code>mnemosyne_recall</code> the same way it calls any other tool</li>
</ul>
<p>The CLI remains useful for inspection (<code>mnemosyne stats</code>), backup (<code>mnemosyne export</code>), and manual management — but it is not a substitute for the MCP integration when Claude is the one that needs to remember things.</p>
<p><span id="more-13170"></span></p>
<h2>Step 0: Disable Claude Code&#8217;s Built-in Auto-Memory</h2>
<p>Claude Code has its own file-based memory system that writes to <code>~/.claude/projects/*/memory/</code>. It runs in parallel with Mnemosyne if not suppressed, duplicating everything. Disable it by adding the following to <code>~/.claude/CLAUDE.md</code> (create it if it doesn&#8217;t exist — this file is loaded in every session regardless of working directory):</p>
<pre><code>## Memory

**Use Mnemosyne exclusively for persistent memory.** Call `mnemosyne_remember` and `mnemosyne_recall` via MCP tools.

**Never write to the file-based auto-memory system** at `~/.claude/projects/*/memory/`. Do not create or edit files there. Do not create or update any `MEMORY.md` index files. That system is not used.</code></pre>
<h2>Step 1: Install via pipx</h2>
<pre><code>pipx install mnemosyne-memory</code></pre>
<p>This installs the <code>mnemosyne</code> CLI to <code>~/.local/bin/mnemosyne</code>.</p>
<h2>Step 2: Install the Hermes Tool Schemas</h2>
<p>The MCP server depends on <code>mnemosyne-hermes</code> for its tool definitions. It must be injected into the same pipx venv:</p>
<pre><code>~/.local/share/pipx/venvs/mnemosyne-memory/bin/python -m pip install mnemosyne-hermes</code></pre>
<p>Skip this and <code>mnemosyne mcp</code> will start and complete the protocol handshake but advertise zero tools — silently broken.</p>
<h2>Step 3: Register the MCP Server</h2>
<pre><code>claude mcp add --scope user mnemosyne   -e MNEMOSYNE_DATA_DIR=$HOME/.local/share/mnemosyne   -- ~/.local/bin/mnemosyne mcp</code></pre>
<p>This writes the entry to <code>~/.claude.json</code>, which is where Claude Code 2.x reads MCP server definitions. Do not add it to <code>~/.claude/settings.json</code> — that file is not used for MCP configuration.</p>
<h2>Step 4: Set the Data Directory in Your Shell</h2>
<p>So that the CLI uses the same database as the MCP server, add to <code>~/.bashrc</code>:</p>
<pre><code>export MNEMOSYNE_DATA_DIR="$HOME/.local/share/mnemosyne"</code></pre>
<p>Then run <code>source ~/.bashrc</code>.</p>
<h2>Step 5: Restart Claude Code and Verify</h2>
<p>MCP servers connect at session startup. After completing the above, start a new Claude Code session, then check:</p>
<pre><code>claude mcp get mnemosyne   # should show Status: &#x2714; Connected
mnemosyne stats            # confirms CLI hits the right database</code></pre>
<h2>Step 6: Install the Mnemosyne Dashboard (Optional)</h2>
<p>The <a href="https://github.com/wysie/mnemosyne-dashboard">Mnemosyne Dashboard</a> is a local-first web UI for browsing, visualising, and maintaining your memory store. It&#8217;s intentionally minimal: Python standard library server, static HTML/CSS/JS frontend, no external JS runtime, no cloud calls, and read-only by default.</p>
<h3>Install via Hermes</h3>
<pre><code>hermes plugins install wysie/mnemosyne-dashboard --enable
hermes gateway restart</code></pre>
<h3>Run as a persistent systemd service (Linux)</h3>
<p>If you want the dashboard to survive Hermes restarts, run it as a systemd user service instead. Create <code>~/.config/systemd/user/mnemosyne-dashboard.service</code>:</p>
<pre><code>[Unit]
Description=Mnemosyne Dashboard
After=network.target

[Service]
Type=simple
WorkingDirectory=%h/.hermes/plugins/mnemosyne-dashboard
ExecStart=python3 server.py --host 0.0.0.0 --port 8765 --db %h/.local/share/mnemosyne/mnemosyne.db
Restart=on-failure
RestartSec=5
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=default.target</code></pre>
<p>Then enable and start it:</p>
<pre><code>systemctl --user daemon-reload
systemctl --user enable mnemosyne-dashboard
systemctl --user start mnemosyne-dashboard</code></pre>
<p>The dashboard will be available at <code>http://localhost:8765/</code> (or your machine&#8217;s LAN IP if you bound to <code>0.0.0.0</code>).</p>
<h3>Configuration</h3>
<p>Config lives at <code>~/.hermes/plugin-data/mnemosyne-dashboard/config.json</code>. Key fields:</p>
<pre><code>{
  "host": "0.0.0.0",
  "port": 8765,
  "db_path": "~/.local/share/mnemosyne/mnemosyne.db",
  "auth_enabled": false,
  "memory_admin_enabled": false
}</code></pre>
<p>Memory admin (supersede, expire, importance updates) is disabled by default. If you enable it on a non-localhost bind address, password auth is required. Admin actions create a SQLite backup and append to an audit log — no hard deletes or raw overwrites are exposed.</p>
<h2>Data Locations</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~/.local/share/mnemosyne/mnemosyne.db</code></td>
<td>Primary database (set via <code>MNEMOSYNE_DATA_DIR</code>)</td>
</tr>
<tr>
<td><code>~/.hermes/mnemosyne/data/mnemosyne.db</code></td>
<td>Default fallback when <code>MNEMOSYNE_DATA_DIR</code> is unset</td>
</tr>
<tr>
<td><code>~/.local/share/pipx/venvs/mnemosyne-memory/</code></td>
<td>pipx virtual environment</td>
</tr>
<tr>
<td><code>~/.hermes/plugin-data/mnemosyne-dashboard/</code></td>
<td>Dashboard config, backups, and audit log</td>
</tr>
</tbody>
</table>
<h2>Troubleshooting</h2>
<h3>MCP server connects but no tools appear</h3>
<p>The <code>mnemosyne-hermes</code> package is missing from the pipx venv. Run Step 2 above. You can confirm by checking the tools/list response — if <code>"tools":[]</code>, the package is missing.</p>
<h3>CLI uses wrong database</h3>
<p>The CLI default is <code>~/.hermes/mnemosyne/data/</code>. Set <code>MNEMOSYNE_DATA_DIR</code> in <code>~/.bashrc</code> (Step 4) to point it at the same path the MCP server uses.</p>
<h3>Tools missing after restart</h3>
<p>The config is probably in the wrong file. Claude Code 2.x reads MCP servers from <code>~/.claude.json</code>, not <code>~/.claude/settings.json</code>. Run <code>claude mcp get mnemosyne</code> — if it says &#8220;not found&#8221;, re-run Step 3.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/06/setting-up-mnemosyne-memory-for-claude-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Connecting WordPress MCP via Tailscale</title>
		<link>https://deuts.net/2026/06/connecting-wordpress-mcp-via-tailscale/</link>
					<comments>https://deuts.net/2026/06/connecting-wordpress-mcp-via-tailscale/#respond</comments>
		
		<dc:creator><![CDATA[Claude]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 17:07:56 +0000</pubDate>
				<category><![CDATA[AI & Automation]]></category>
		<category><![CDATA[Selfhosting]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[Tailscale]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13158</guid>

					<description><![CDATA[Most guides for connecting AI assistants to a self-hosted WordPress site via MCP suggest using Cloudflare Tunnel or ngrok to expose the site publicly. This works, but it also reintroduces infrastructure layers that can interfere with MCP: WAFs, bot-fight rules, page caches, and host-level rewrites that intercept REST API requests before WordPress ever handles them. &#8230; <a href="https://deuts.net/2026/06/connecting-wordpress-mcp-via-tailscale/" class="more-link">Continue reading <span class="screen-reader-text">Connecting WordPress MCP via Tailscale</span></a>]]></description>
										<content:encoded><![CDATA[<p>Most guides for connecting AI assistants to a self-hosted WordPress site via MCP suggest using Cloudflare Tunnel or ngrok to expose the site publicly. This works, but it also reintroduces infrastructure layers that can interfere with MCP: WAFs, bot-fight rules, page caches, and host-level rewrites that intercept REST API requests before WordPress ever handles them.</p>
<p>A cleaner alternative, if your machines are already on <a href="https://tailscale.com">Tailscale</a>: skip the public internet entirely.</p>
<p><span id="more-13158"></span></p>
<h2>The Problem with Cloudflare and MCP</h2>
<p>The <code>@automattic/mcp-wordpress-remote</code> package connects to WordPress via the REST API using HTTP Basic Auth (Application Passwords). Any edge layer that interferes with those REST API calls can silently break the connection. Common culprits when routing through Cloudflare:</p>
<ul>
<li>Bot Fight Mode blocking REST API POSTs</li>
<li>Page caches returning stale or HTML responses on JSON endpoints</li>
<li>Host WAFs blocking requests based on User-Agent strings</li>
<li>Security plugins blocking access to the MCP endpoint</li>
</ul>
<h2>The Tailscale Approach</h2>
<p>Since Claude Code runs the MCP client locally, it only needs the WordPress server to be reachable from the local machine — not from Anthropic&#8217;s servers. If both machines are on the same Tailscale network, you can route traffic directly over Tailscale by pinning the domain in <code>/etc/hosts</code>:</p>
<pre><code>100.x.x.x        yourdomain.com
fd7a:xxxx::xxxx  yourdomain.com</code></pre>
<p>Both IPv4 and IPv6 entries are needed. Without the IPv6 entry, DNS can still return Cloudflare&#8217;s AAAA records and route around the pin.</p>
<p>With this in place, <code>yourdomain.com</code> resolves to the Tailscale IP, traffic goes peer-to-peer, and none of the Cloudflare/WAF/cache layers are involved. The SSL certificate remains valid because the hostname matches.</p>
<h2>The Plugin</h2>
<p>The active WordPress MCP plugin is <a href="https://github.com/WordPress/mcp-adapter">WordPress/mcp-adapter</a> (not the older <code>wordpress-mcp</code> repo, which is deprecated). The endpoint lives at:</p>
<pre><code>https://yourdomain.com/wp-json/mcp/mcp-adapter-default-server</code></pre>
<p>Authentication is WordPress Application Passwords (Users → Profile → Application Passwords) via HTTP Basic Auth. XML-RPC is not involved.</p>
<h2>MCP Client Configuration</h2>
<p>In your Claude Code MCP config (<code>~/.claude.json</code>):</p>
<pre><code>{
  "mcpServers": {
    "wordpress": {
      "command": "npx",
      "args": ["@automattic/mcp-wordpress-remote"],
      "env": {
        "WP_API_URL": "https://yourdomain.com/wp-json/mcp/mcp-adapter-default-server",
        "WP_API_USERNAME": "your-wp-username",
        "WP_API_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
        "PATH": "/home/user/.nvm/versions/node/v24.x.x/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      }
    }
  }
}</code></pre>
<p>Two critical details:</p>
<ul>
<li><strong><code>WP_API_URL</code> must be the full endpoint path</strong>, not just the domain. Passing a bare domain puts the package into legacy mode, where it targets <code>/wp-json/wp/v2/wpmcp</code> — the old deprecated plugin&#8217;s endpoint — returning a 404.</li>
<li><strong><code>PATH</code> must be set explicitly</strong> if Node is installed via NVM. Claude Code&#8217;s environment doesn&#8217;t inherit your shell&#8217;s NVM paths, so without this the <code>npx</code> call fails to find Node.</li>
</ul>
<h2>Result</h2>
<p>A successful MCP handshake returns a session ID and server info:</p>
<pre><code>{"protocolVersion":"2024-11-05","serverInfo":{"name":"MCP Adapter Default Server","version":"v1.0.0"}}</code></pre>
<p>No tunnels, no WAF exceptions, no cache exclusion rules — just a direct Tailscale connection to your own server.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/06/connecting-wordpress-mcp-via-tailscale/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>When Security Becomes Friction for Meralco Online</title>
		<link>https://deuts.net/2026/01/when-security-becomes-friction-for-meralco-online/</link>
					<comments>https://deuts.net/2026/01/when-security-becomes-friction-for-meralco-online/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Sat, 24 Jan 2026 13:40:55 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Meralco]]></category>
		<category><![CDATA[Online]]></category>
		<category><![CDATA[Online Security]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13153</guid>

					<description><![CDATA[Meralco’s online system feels like it was designed with the mindset of a bank, not a utility company. The information involved is basic—who you are, where the service is, and how much the bill is. Still, getting a simple PDF copy of a monthly bill means logging in, clicking through several pages, and repeating the process for each account, even though the bill amount is already shown in notifications.

The security measures themselves are not the issue; the lack of balance is. Blocking keyboard autofill while allowing paste, requiring OTPs just to view a bill, and forcing customers to use the website for something that could be emailed all add friction without real benefit. Security should protect users where it matters, not make routine tasks harder than they need to be.]]></description>
										<content:encoded><![CDATA[<p>Meralco is a good example of a company overdoing online security in places where the actual risk is low.</p>
<p>Meralco is a utility company. It is not a bank, an e-wallet provider, or a financial institution holding customer funds. The information it needs to protect—customer name, service address, and billing amount—is important, but it does not carry the same risk profile as banking credentials or stored monetary value. The security approach should reflect that difference.</p>
<p><span id="more-13153"></span></p>
<h3>A Bill You Can See but Not Easily Get</h3>
<p>When Meralco notifies customers that a monthly bill is available, the notification already displays the bill amount. That means the information is already deemed safe enough to transmit. Despite that, the actual PDF copy of the bill is not included.</p>
<p>To obtain it, customers must log in to the website, navigate through several pages, dismiss pop-ups, and repeat the process for each registered account each month. All this just to download a document that could have been emailed to me in the first place. Encrypt the PDF if you want—I do not care. Just send it.</p>
<h3>Login Restrictions That Add Friction, Not Security</h3>
<p>The login experience also raises questions about proportionality.</p>
<p>Pasting a password is allowed, but keyboard-based autofill—commonly used by password managers to populate both email address and password—is blocked. This forces manual entry of the email address while offering no meaningful improvement in security. It prevents convenience, not misuse.</p>
<p>Logging in from a different device also requires a one-time password sent to a registered mobile number. This is reasonable for high-risk actions, but for viewing or downloading a bill, it feels misaligned with the nature of the transaction. There are no funds to move—only a balance to view.</p>
<h3>Repeating the Same Process, Every Month</h3>
<p>For users managing multiple Meralco accounts under one profile, this experience is multiplied. Using the website for account administration is understandable. Being required to go through the same multi-step process every month, for every account, just to download bills is not.</p>
<p>This is a problem with workflow design, not user behavior.</p>
<h3>A Simpler, More Balanced Approach</h3>
<p>Emailing the monthly bill as a PDF would resolve most of these issues immediately. The website can remain the place for account management and changes. Routine access to a billing document should not require repeated navigation through a heavily restricted interface.</p>
<p>Good digital security should be based on balance—strong where risk is high, and simple where it is not.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2026/01/when-security-becomes-friction-for-meralco-online/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>n8n alternatives</title>
		<link>https://deuts.net/2025/11/n8n-alternatives/</link>
					<comments>https://deuts.net/2025/11/n8n-alternatives/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Tue, 25 Nov 2025 17:16:15 +0000</pubDate>
				<category><![CDATA[Selfhosting]]></category>
		<category><![CDATA[ActivePieces]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Langflow]]></category>
		<category><![CDATA[n8n]]></category>
		<category><![CDATA[Windmill]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13144</guid>

					<description><![CDATA[I recently discovered that there are a few solid, self-hosted alternatives to n8n. Here’s a quick comparison of their GitHub stars and key features (as of Nov. 26, 2025): Platform GitHub Stars Self-hosted Focus / Best Use Case n8n 159k ✅ Yes General-purpose workflow automation with powerful code node. Ideal for complex multi-service automations and &#8230; <a href="https://deuts.net/2025/11/n8n-alternatives/" class="more-link">Continue reading <span class="screen-reader-text">n8n alternatives</span></a>]]></description>
										<content:encoded><![CDATA[<p>I recently discovered that there are a few solid, self-hosted alternatives to n8n. Here’s a quick comparison of their GitHub stars and key features (as of Nov. 26, 2025):</p>
<style>
  .autosize-table {
    width: 100%;
    border-collapse: collapse;
    table-layout: auto; /* allow columns to size based on content */
  }
  .autosize-table th,
  .autosize-table td {
    padding: 6px;
    border: 1px solid #ccc;
  }
  /* Make the last column occupy remaining space */
  .autosize-table td:last-child,
  .autosize-table th:last-child {
    width: 100%;
  }
</style>
<table class="autosize-table">
<thead>
<tr>
<th>Platform</th>
<th>GitHub Stars</th>
<th>Self-hosted</th>
<th>Focus / Best Use Case</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>n8n</strong></td>
<td>159k</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes</td>
<td>General-purpose workflow automation with powerful code node. Ideal for complex multi-service automations and ETL tasks.</td>
</tr>
<tr>
<td><strong>Activepieces</strong></td>
<td>19.3k</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes</td>
<td>Low-code/no-code automation with occasional custom JS support. Good for lighter, simpler workflows.</td>
</tr>
<tr>
<td><strong>Windmill</strong></td>
<td>15.2k</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes</td>
<td>Developer-centric automation using scripts (Python/TypeScript/Go). Great for internal tools and backend workflows.</td>
</tr>
<tr>
<td><strong>Automatisch</strong></td>
<td>13.4k</td>
<td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Yes</td>
<td>Simplified Zapier-style automation. Best for small, straightforward tasks when ease and self-hosting matter.</td>
</tr>
</tbody>
</table>
<p><strong>Summary:</strong> n8n remains the most powerful and versatile, while Activepieces and Windmill offer lighter or more code-centric alternatives. Automatisch is best if you just need simple self-hosted automations.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2025/11/n8n-alternatives/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Lost Its Soul</title>
		<link>https://deuts.net/2025/11/wordpress-lost-its-soul/</link>
					<comments>https://deuts.net/2025/11/wordpress-lost-its-soul/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Sun, 23 Nov 2025 14:55:53 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=13142</guid>

					<description><![CDATA[WordPress feels more like a marketplace than a community, making it surprisingly hard to find a simple, minimalist blogging theme without blocks or upsells.]]></description>
										<content:encoded><![CDATA[<p>What happened to WordPress?</p>
<p>The whole ecosystem—themes, plugins, and even the support culture—has turned into a marketplace. Everywhere you go, there’s an upsell. Basic features sit behind paywalls. And if you just want to build a straightforward blog, the experience is frustrating.</p>
<p>Finding a minimalist theme with a clean two-column layout, no widget blocks, no theme blocks, no Gutenberg clutter, and no upgrade prompts used to be easy. Now it feels like searching for something that shouldn’t be rare. Most themes are bloated with builders, bundled features, and aggressive pro-version hooks.</p>
<p>The open-source spirit that made WordPress welcoming has given way to commercial noise. WordPress is still free at its core, but the culture around it has shifted. For someone who simply wants a clean, honest blogging theme, it’s hard not to feel like WordPress has lost its soul.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2025/11/wordpress-lost-its-soul/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Navigating the Challenges of Mobile Payments: A Lesson from GCash Spam SMS</title>
		<link>https://deuts.net/2024/06/navigating-the-challenges-of-mobile-payments-a-lesson-from-gcash-spam-sms/</link>
					<comments>https://deuts.net/2024/06/navigating-the-challenges-of-mobile-payments-a-lesson-from-gcash-spam-sms/#respond</comments>
		
		<dc:creator><![CDATA[deuts]]></dc:creator>
		<pubDate>Fri, 21 Jun 2024 01:22:18 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Digital Wallets]]></category>
		<category><![CDATA[GCash]]></category>
		<category><![CDATA[Maya]]></category>
		<category><![CDATA[Mobile Payment]]></category>
		<category><![CDATA[Paymaya]]></category>
		<category><![CDATA[SMS Marketing]]></category>
		<guid isPermaLink="false">https://deuts.net/?p=9451</guid>

					<description><![CDATA[Paying bills has never been easier, thanks to the advent of mobile payment solutions like GCash and Maya. However, my recent experience with GCash highlighted a significant issue that needs addressing. The Issue with Spam SMS Recently, I was paying for my Globe Postpaid plan and decided to use GCash for the transaction. However, in &#8230; <a href="https://deuts.net/2024/06/navigating-the-challenges-of-mobile-payments-a-lesson-from-gcash-spam-sms/" class="more-link">Continue reading <span class="screen-reader-text">Navigating the Challenges of Mobile Payments: A Lesson from GCash Spam SMS</span></a>]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" src="https://deuts.net/wp-content/uploads/2024/06/gcash-maya.jpg" alt="" width="950" height="633" class="alignnone size-full wp-image-9452" srcset="https://deuts.net/wp-content/uploads/2024/06/gcash-maya.jpg 950w, https://deuts.net/wp-content/uploads/2024/06/gcash-maya-640x426.jpg 640w, https://deuts.net/wp-content/uploads/2024/06/gcash-maya-320x213.jpg 320w, https://deuts.net/wp-content/uploads/2024/06/gcash-maya-768x512.jpg 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<p>Paying bills has never been easier, thanks to the advent of mobile payment solutions like GCash and Maya. However, my recent experience with GCash highlighted a significant issue that needs addressing.</p>
<h3>The Issue with Spam SMS</h3>
<p>Recently, I was paying for my Globe Postpaid plan and decided to use GCash for the transaction. However, in the past few days, I’ve been inundated with spam marketing SMS from GCash. The frequency and irrelevance of these messages were frustrating, so I decided to block GCash in my Google Messages app.</p>
<h3>The Unintended Consequence</h3>
<p>When I attempted to pay my bill via GCash, I didn’t receive the OTP (One-Time Password) required to complete the transaction. It quickly dawned on me that GCash was blocked, preventing the OTP from coming through. I unblocked GCash temporarily, but the OTP still took too long to arrive. This delay was unacceptable, especially when trying to complete a time-sensitive transaction.<br />
<span id="more-9451"></span></p>
<h3>Switching to Maya</h3>
<p>Frustrated by the inconvenience, I turned to Maya for my payment. The process was smooth, and I received the OTP without any issues. This experience was a stark contrast to the one I had with GCash and highlighted a crucial lesson for businesses: customer satisfaction is paramount.</p>
<h3>The Impact of Spam SMS</h3>
<p>Spam SMS not only annoy customers but can also lead to significant business losses. When customers are overwhelmed with irrelevant messages, they’re likely to block the sender, missing out on important communications like OTPs. This leads to frustration and can drive customers to competitors, as it did in my case.</p>
<h3>A Call to Action for Businesses</h3>
<p>For businesses utilizing SMS for marketing, it’s crucial to strike a balance. While reaching out to customers is essential, bombarding them with spam can backfire. One effective strategy is to limit marketing messages to a separate account, distinct from the one used for important communications like OTPs. Additionally:</p>
<ol>
<li><strong>Opt-in Preferences</strong>: Allow customers to choose the type of messages they want to receive.</li>
<li><strong>Frequency Control</strong>: Limit the number of marketing messages sent within a certain period.</li>
<li><strong>Relevance</strong>: Ensure that messages are relevant to the customer’s interests and needs.</li>
</ol>
<h3>Conclusion</h3>
<p>My experience underscores the importance of thoughtful and strategic communication with customers. By respecting customer preferences and reducing spam, businesses like GCash can improve customer satisfaction and retain their user base.</p>
<p>In the end, the key takeaway is clear: respect your customers&#8217; communication preferences, or risk losing them to competitors who do.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://deuts.net/2024/06/navigating-the-challenges-of-mobile-payments-a-lesson-from-gcash-spam-sms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
