Work Portfolio & Case Studies
Nope!
Password required. This section is private.
Want to learn more about my work and how it's impacted other organizations? Reach out →
Koinly: Head of Marketing & Partnerships
← Go to all case studies
Context

Koinly is crypto tax software. It syncs exchanges, wallets and DeFi protocols, calculates capital gains, and produces filing-ready reports across 140+ jurisdictions. It is self-serve and transaction-priced rather than subscription, and demand is sharply seasonal around tax deadlines in four core markets: US, Australia, UK and Canada.

I am Head of Marketing and Partnerships, reporting to the CEO, owning every marketing function plus partnerships. The user base has grown from 1.5M to 2.2M as of September 2026.

Koinly is profitable and market leader in three of its four core markets. The remit is moving it from working to thriving, diversifying beyond the core markets, and finding new growth opportunities. In practice that means installing the processes the department did not have, building a team that owns its channels end to end, and making decisions on evidence rather than instinct. Most of what follows is the infrastructure behind the last of those, because it turned out to be the constraint on the rest.

01

Team & Operating System

The department was organised to produce output rather than own outcomes: channels had people working on them but no single person accountable for their numbers.

The redesign started from one principle: every individual contributor owns a channel or domain and is accountable for its KPIs. If a role cannot point to a number that is its own, the role is designed wrong. A second principle follows from it: no shared ownership, because when two people could reasonably own a surface, accountability belongs to one of them and the other is a collaborator.

That became an ownership map across every marketing surface, with exactly one name in the accountable column per row. Signup rate overall, then signups from organic, direct, video, social, paid, affiliates and partners, each with a responsible owner, an accountable owner, and who is consulted or informed. Two support roles are an acknowledged exception: a technical content creator and a designer raise the quality of channel owners' output rather than carry channel KPIs, and their work is requested through a single route rather than pulled in eight directions. Grey zones were resolved before hiring rather than after.

Building the team around those roles meant running five searches inside one low-season window, so hiring had to be a system rather than a sequence of conversations. I wrote the specs, built a role-specific take-home assessment with its own rubric for each, and scored candidates against a benchmark profile for the role. More than 2,000 applications have resulted in three hires across three new roles so far.

02

Business Intelligence & Data Access

Data was locked down for good security reasons, which meant most teams made decisions without seeing their own numbers.

Event and transaction data was captured reliably, but there was no BI process above it and no agreed KPI set. Opening the warehouse was not an option, and should not have been.

I built the analytics layer behind the business, in Metabase on the Snowflake warehouse, designed around how the company operates rather than around marketing reporting. It comprises four data models, ten headline metrics, two dashboards and over fifty queries, with high-level filtering so any figure splits by channel, market, user segment or period rather than being rebuilt each time. The models replaced ad hoc dashboard cards that returned inconsistent answers to the same question.

Then a lightweight reporting system to get the right KPIs to the right teams without opening up the warehouse. Scripts, automations and Sheets: twelve scheduled Apps Script jobs write defined metrics into spreadsheets, covering organic performance by page type and channel, weekly keyword positions across four markets, monthly partner contribution, competitor traffic and paid snapshots. Teams get the figures their decisions depend on, scoped to what they need, with no warehouse credential issued. A compromised account exposes a sheet of aggregates, not the customer table.

Part of the work was joining sources that did not talk to each other, so a single number could be trusted: ad platform cost against warehouse revenue and conversions, at daily level per campaign, which is what produces a true ROI per campaign and CAC per channel rather than each platform's own version of both. That layer is also what made two things findable: a long-running partnership was reclassified from an exchange integration into a geographic acquisition channel, and every historic paid return figure turned out to have been overstated by an unreconciled currency mismatch between ad spend and revenue.

It answers the constraint rather than settling the architecture. Self-serve with role-based permissions is the right destination, where teams query inside a defined boundary instead of receiving a prepared sheet.

03

AI Agents: Competitor Watch

Tracking what competitors were doing across their channels and reviews was manual, inconsistent and time-consuming, so it happened late and produced snapshots instead of a trend.

What it does: it watches the competitor set. Their social channels, everything they publish, and their review sentiment on Trustpilot, down to every individual review rather than just a score. It shares monthly reports built to be read in a minute, and it keeps the history, so position reads as a trend instead of a one-off snapshot.

Done by hand, that work reached beyond marketing, with support carrying the review side, and it never built up history, because nobody goes back and rebuilds a year of competitor numbers.

There is a layer of thought between the data and the report. The agent only ever touches the data it is given, but it is not a scraper posting rows: it aggregates, compares across the set, and produces the insight or the snapshot the team actually needed from that data.

The team works with it in Slack, where they already are, so they can read a report and then ask it questions rather than opening another tool. Nothing here touches customer data, an inbox or an email platform.

Tools used: EVE framework, n8n, Apify, Slack.

10-15 h/month
Manual work replaced (est.)
Competitor YouTube: monthly growth, with a month-over-month views table
Competitor YouTube: monthly growth, with a month-over-month views table
Competitor X: follower growth and engagement by post type
Competitor X: follower growth and engagement by post type
Competitor reviews: rating movement, velocity, and the themes behind it
Competitor reviews: rating movement, velocity, and the themes behind it
04

AI Agents: Content QA & Content Watch

We publish a large volume of content against the tax regulations of more than 100 countries, and the brand runs on that content being right. Checking what has changed, and what competitors have moved on, took more time than the team had.

What it does: two checks on published pages. It checks our own guides against the official tax agency sources, so that when a regulation changes we find out before a reader does. And it watches what competitors publish and, more usefully, what they quietly update, which is the signal the content team would otherwise miss entirely and now gets ahead of.

Why it matters more here than in most categories: people file their taxes against our guidance, so accuracy is not a quality metric, it is the product's credibility. At this volume of content across this many jurisdictions, nobody can hold it in their head, and re-reading the back catalogue is not a plan. In practice that meant coverage was partial and the full set was never current.

Same layer of thought as the watch agent. It reads the sources it is given and returns a judgment rather than a diff. Its only write is to its own internal ruleset, never to the live site, and reversible in one click. What it produces is a flag for a person, never an edit.

The team picks it up in Slack alongside the others.

Tools used: EVE framework, n8n, Firecrawl, Slack.

10-20 h/month
Manual checking replaced (est.)
100+
Jurisdictions monitored continuously
Regulation watch: each authority's official sources checked against the stored ruleset, capturing the citation and effective date
Regulation watch: each authority's official sources checked against the stored ruleset, capturing the citation and effective date
Guide accuracy: every rule-bound claim on a page checked against the ruleset
Guide accuracy: every rule-bound claim on a page checked against the ruleset
05

AI Agents: Partner & Affiliate Inbox

Inbound from accountants wanting to partner and affiliates asking questions arrived faster than it could be answered well, and most of answering it well is repetition.

What it does: it reads the affiliate and partnerships inboxes, drafts the reply, and routes the decision. It works from the affiliate playbook and the filter we judge an accountant partnership by: what gets approved, what gets turned down, and what needs a follow-up question before either. Spam is set aside and never answered.

How it decides: it recommends with its reasoning rather than ruling. Each case reaches the teammate who owns that call with the draft already written, so the work left is the judgment, not the typing.

A person is always in the loop. The agent holds no send rights, so every reply waits for someone to send it. The repetition is worth automating and the judgment is not, and nothing leaves the business without a human behind it.

Tools used: EVE framework, n8n, Slack.

10-15 h/month
Drafting and triage replaced (est.)
Accountant partnership request: enriched, assessed for fit, routed to approve, ask, or reject
Accountant partnership request: enriched, assessed for fit, routed to approve, ask, or reject
Affiliate inbox: spam set aside, real mail drafted for a person to approve
Affiliate inbox: spam set aside, real mail drafted for a person to approve
06

Partnership Decision & Incrementality System

The only available measure of a partnership, signups carrying its code, counts attribution rather than addition.

Partnerships are already an inbound channel. The ecosystem asks to integrate with us because the brand is strong, but every integration carries real product and development cost. There was no way to answer the question that matters: of all this inbound, what is worth doing.

So I built the system that answers it, in three parts. For inbound partners, is the development effort worth it. For partners we already have, is the account worth growing or the placement worth renegotiating, which is the incrementality test: did non-attributed acquisition from that audience hold or grow, or did the coded column simply fill from it. For outbound, is this partner worth pursuing at all.

The output reordered the roster. One well-known exchange cleared every gate: nearly 4x above its own pre-deal trend, paying users per 10,000 signups roughly quadrupled, and non-attributed acquisition rose rather than fell, which is the signature of real addition. A second partner moved total signups from its audience by about 1% while its coded column filled from the non-attributed one, so it is a maintain case, not an investment case. A third was not an exchange integration at all: under 1% of its coded users ever connected its own wallet, and its users cluster on one country's exchanges at 23-26% against 5% or below elsewhere, so it is now run as a geographic acquisition channel.

Outbound is ranked by the same criteria rather than by who asked: 48 exchanges and over 200 secondary platforms mapped against trust score, market share and priority geography, sorted into maintain, re-engage and pursue.

The test also changes what the numbers say. Read the flattering way, one partnership looked like it was working, with acquisition close to doubled. Run through the incrementality test, the same data says it needs work. That is the version we reported.

~3.9x
Top partner vs its own pre-deal trend
~4x
Paying users per 10k signups, same partner
48
Exchanges mapped and ranked for outbound
200+
Secondary platforms mapped
08

ICP & Segmentation

The ICP was "crypto investors", broad enough to be no definition at all, and unclear positioning meant unclear messaging.

I scoped a quantitative segmentation study across the customer base, comparing the highest and lowest value cohorts by lifetime spend. Rather than demographics it read product signals: transaction behaviour, activation, the kinds of wallets and platforms a user connects, and purchase patterns. Those separated the two cohorts far more sharply than anything in a persona document, several of them by orders of magnitude.

The output was an ICP with measurable entry criteria rather than a description, which is what made it usable: campaigns and messaging could aim at signals the data could confirm. Three decisions followed. Acquisition messaging moved onto first purchase rather than expansion. Retention took priority over conversion speed. And the free-tier emphasis the funnel had been leaning on came off, because the evidence did not support it. The qualitative half, user interviews and journey mapping, remains open.

09

Brand Harmonization

The brand was inconsistent across channels, and successive rebrand attempts had stalled before reaching implementation.

Brand direction is founder-led, which is normal at this stage and does mean a full identity change needs an alignment that had not held before. Rather than treat that as a prerequisite, I took the improvement that was actually available: not zero to one, but zero to 0.5 to one. A proper rebrand stays on the table. It was not what the channels needed first.

What they needed was consistency. Every surface had drifted into its own system: site, social, email, reports, each with its own colour palette and its own rules, so the company looked like a different company depending on where you met it. I identified the elements doing the most work, the ones a reader actually registers, and harmonized those across surfaces instead of redrawing the identity.

The approach was to find the common ground rather than impose one. We interviewed users and team members to establish which elements people genuinely recognised as the brand, and built from what was shared. With no full-time designer on the team, the output also had to be usable by people who are not designers: templates and reusable panels, not a specification someone has to interpret.

That became a documented system rather than a deck: the layout grid and spacing scale, separate type scales for marketing pages and articles, colour tokens, and the component library as it actually renders, from buttons and eyebrow tags through review cards, FAQs and CTA blocks. On top of it a report system, with layout patterns, a chart palette, a report type scale, and copy and print rules, contrast ratios checked so type on brand colour passes rather than nearly passes. It was captured from the live site by reading computed styles off the DOM, because the site blocks crawlers, so the spec describes what ships rather than what someone intended three years ago.

That system is what now functions as the brand guidelines, and new work is built against it. It is also still a work in progress. What used to be a different system per surface is now two, the site brand and the social brand, which stay separate because they sit with different owners, and harmonizing those two is the next step. The system is marked canonical over the unshipped proposal, so nothing gets built against a direction that has not landed.

← Go to all case studies