<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PII on James Greenhalgh on digital strategy, marine conservation, and adventures.</title>
    <link>https://jamesgreenblue.com/tags/pii/</link>
    <description>Recent content in PII on James Greenhalgh on digital strategy, marine conservation, and adventures.</description>
    <image>
      <title>James Greenhalgh on digital strategy, marine conservation, and adventures.</title>
      <url>https://jamesgreenblue.com/img/jgb-banner.png</url>
      <link>https://jamesgreenblue.com/img/jgb-banner.png</link>
    </image>
    <generator>Hugo -- 0.148.2</generator>
    <language>en-gb</language>
    <copyright>This work is licensed under a Creative Commons Attribution 4.0 International License.</copyright>
    <lastBuildDate>Tue, 12 Aug 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://jamesgreenblue.com/tags/pii/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Identify your users by name in Amplitude</title>
      <link>https://jamesgreenblue.com/blog/2025/name-users-in-amplitude/</link>
      <pubDate>Tue, 12 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://jamesgreenblue.com/blog/2025/name-users-in-amplitude/</guid>
      <description>&lt;p&gt;Amplitude is a decent product analytics tool, but there is no compromise when it comes to identification. User IDs are fixed forever and all data is immutable once it lands in the platform – names and email addresses are not an option.&lt;/p&gt;
&lt;p&gt;Knowing the name of a user can unlock insight by giving context to usage patterns, especially in early-stage projects with a handful of users who are working at the same company.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Amplitude is a decent product analytics tool, but there is no compromise when it comes to identification. User IDs are fixed forever and all data is immutable once it lands in the platform – names and email addresses are not an option.</p>
<p>Knowing the name of a user can unlock insight by giving context to usage patterns, especially in early-stage projects with a handful of users who are working at the same company.</p>
<p>I&rsquo;m not aware of a way to make annotations directly in Amplitude; all data has to arrive over their API. Anyway, doing this would expose personally identifiable information (PII) to a third party.</p>
<p>To solve this, <a href=https://jamesgreenblue.com/blog/2025/credit-the-vibes/
    
    
>I worked with Gemini</a> to develop a <a href=https://tampermonkey.net
    
    target=_blank rel="noopener"
>Tampermonkey</a> userscript that finds and replaces the user ID with text of your choosing. For the uninitiated, Tampermonkey is a browser extension that lets you change how websites function.</p>
<p>To do the same simply:</p>
<ol>
<li>Install <a href=https://chromewebstore.google.com/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
    
    target=_blank rel="noopener"
>Tampermonkey</a></li>
<li>Copy the code below:</li>
</ol>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// ==UserScript==
</span></span></span><span class="line"><span class="cl"><span class="c1">// @name         Amplitude named user profiles
</span></span></span><span class="line"><span class="cl"><span class="c1">// @namespace    https://jamesgreenblue.com/
</span></span></span><span class="line"><span class="cl"><span class="c1">// @version      0.1
</span></span></span><span class="line"><span class="cl"><span class="c1">// @description  Finds and replaces user profile names in Amplitude
</span></span></span><span class="line"><span class="cl"><span class="c1">// @author       James Greenhalgh, with significant contributions from an AI Assistant (Gemini)
</span></span></span><span class="line"><span class="cl"><span class="c1">// @match        *://app.amplitude.com/*
</span></span></span><span class="line"><span class="cl"><span class="c1">// @grant        none
</span></span></span><span class="line"><span class="cl"><span class="c1">// ==/UserScript==
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;use strict&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">replaceArry</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span><span class="sr">/user_cva3bbm9i077dn133b2h/gi</span><span class="p">,</span> <span class="s1">&#39;james.g&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span><span class="sr">/user_cva4gge9i077spp33b3h/gi</span><span class="p">,</span> <span class="s1">&#39;joe.b&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span><span class="sr">/user_cva64re9i078i0h33b41/gi</span><span class="p">,</span> <span class="s1">&#39;jane.d&#39;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// Add more replacements here
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">numTerms</span> <span class="o">=</span> <span class="nx">replaceArry</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">replaceTextInNode</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">nodeType</span> <span class="o">===</span> <span class="nx">Node</span><span class="p">.</span><span class="nx">TEXT_NODE</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="kd">let</span> <span class="nx">oldTxt</span> <span class="o">=</span> <span class="nx">node</span><span class="p">.</span><span class="nx">nodeValue</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="kd">let</span> <span class="nx">newTxt</span> <span class="o">=</span> <span class="nx">oldTxt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">numTerms</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">newTxt</span> <span class="o">=</span> <span class="nx">newTxt</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">replaceArry</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="nx">replaceArry</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nx">newTxt</span> <span class="o">!==</span> <span class="nx">oldTxt</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">node</span><span class="p">.</span><span class="nx">nodeValue</span> <span class="o">=</span> <span class="nx">newTxt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">nodeType</span> <span class="o">===</span> <span class="nx">Node</span><span class="p">.</span><span class="nx">ELEMENT_NODE</span> <span class="o">&amp;&amp;</span> <span class="nx">node</span><span class="p">.</span><span class="nx">childNodes</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">node</span><span class="p">.</span><span class="nx">childNodes</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">replaceTextInNode</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Initial scan of the document
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nx">replaceTextInNode</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Observe for future changes
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kr">const</span> <span class="nx">observer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MutationObserver</span><span class="p">(</span><span class="nx">mutations</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">mutations</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">mutation</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">mutation</span><span class="p">.</span><span class="nx">addedNodes</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">node</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">nodeType</span> <span class="o">===</span> <span class="nx">Node</span><span class="p">.</span><span class="nx">ELEMENT_NODE</span> <span class="o">||</span> <span class="nx">node</span><span class="p">.</span><span class="nx">nodeType</span> <span class="o">===</span> <span class="nx">Node</span><span class="p">.</span><span class="nx">TEXT_NODE</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">replaceTextInNode</span><span class="p">(</span><span class="nx">node</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">});</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// For text content changes within existing nodes
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="k">if</span> <span class="p">(</span><span class="nx">mutation</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;characterData&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">mutation</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">replaceTextInNode</span><span class="p">(</span><span class="nx">mutation</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">observer</span><span class="p">.</span><span class="nx">observe</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">,</span> <span class="p">{</span> <span class="nx">subtree</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">childList</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">characterData</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">})();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="3">
<li>Edit the rows in <code>replaceArry</code> to match the ID you see in Amplitude with the name you would like to see instead. Add more replacements if necessary. I suggest avoiding full names to minimise PII on your local machine.</li>
<li>Save and enable the script in Tampermonkey</li>
<li>Gain insight</li>
</ol>
<p>This userscript is also <a href=https://github.com/jamesgreenblue/tm-name-users-in-amplitude
    
    target=_blank rel="noopener"
>published on GitHub</a> if you would like to fork your own version or report issues.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
