Guides

How I Built an Employee Advocacy Scoreboard with Directus, Zapier, and Claude Code

A practical guide to tracking team social sharing with AI-powered detection, Directus as the backend, and a vibecoded React dashboard.

Matt Minor

Senior Director, Growth

The Problem

Those employee advocacy programs. So hot right now.




Zoolander

According to Semrush, LinkedIn is the second most-cited source in LLM responses (after Reddit), which means your team's social presence directly impacts your company's AI discoverability.




semrush-cited-sources-llm

But tracking who's posting what? That's usually a spreadsheet nightmare.

I wanted something visual. A scoreboard that updates automatically when someone shares company content. Here's how I built it.

The Stack

  • Slack - where teammates drop links to their posts

  • Zapier - automation layer with GPT-4o-mini for AI detection

  • Directus - headless CMS as the data backend

  • Next.js + Vercel - frontend dashboard

  • Claude Code - scaffolded the entire frontend from a conversation and mapped the Directus data.

The Flow

  1. Teammate posts on LinkedIn or X

  2. They drop the link in our #upvotes-plz Slack channel

  3. Zapier catches the message, runs it through GPT-4o-mini to detect if it's a social link

  4. If yes, a second AI step extracts the platform and cleans the URL

  5. Zapier posts the data to Directus

  6. Dashboard pulls from Directus and displays the leaderboard

Step 1: The Slack Trigger

We have a dedicated Slack channel where teammates drop links after they post. Nothing fancy - just paste the URL with optional context.




slack-post-sht-post

Step 2: AI Detection (Zapier)




Zapier Flow

The first Zapier step runs the message through GPT-4o-mini with a simple prompt:

Analyze the provided post to assess whether it includes a link to a social media platform. If the post does contain a link to a social platform, output the boolean value true. If it does not contain such a link, output the boolean value false
Analyze the provided post to assess whether it includes a link to a social media platform. If the post does contain a link to a social platform, output the boolean value true. If it does not contain such a link, output the boolean value false
Analyze the provided post to assess whether it includes a link to a social media platform. If the post does contain a link to a social platform, output the boolean value true. If it does not contain such a link, output the boolean value false
Analyze the provided post to assess whether it includes a link to a social media platform. If the post does contain a link to a social platform, output the boolean value true. If it does not contain such a link, output the boolean value false

This returns a boolean. A path condition routes true results to the next step.

Step 3: Data Cleaning (Zapier)

The second AI step extracts structured data:

## CONTEXT ##
You are a data cleaning expert tasked with analyzing and cleaning Slack posts in order to effectively understand and evaluate a specific post. Your responsibilities include:
1. Extracting the context of the post.
2. Identifying the platform where the post originates (to be scraped via link).
3. Analyzing the social link included in the post.

The output will be integrated into a Directus instance, so it is essential that we achieve clarity in the shared message and ensure conformity to the specified data model.

## OBJECTIVE ##
Our team at Directus will send a message every time they share content on social media. We will then input this information into a Directus instance, necessitating strict adherence to the post requirements. Your goal is to extract specific information from the post, focusing on the following:
1. Determine if the shared content includes a link to a social post on LinkedIn or X. If the link does not lead to either of these platforms, please disregard the post as it is not relevant for this task.
2. Identify the platform of the social post based on the URL provided, checking specifically for indicators such as LinkedIn or X.com.

## OUTPUT ##
Based on your analysis of the post, please provide the following in your output:
1. Identify the platform as either "X" or "LinkedIn" based on the presence of a relevant link.
2. Supply the cleaned URL, ensuring that any UTM parameters or extraneous query strings are removed from the link

## CONTEXT ##
You are a data cleaning expert tasked with analyzing and cleaning Slack posts in order to effectively understand and evaluate a specific post. Your responsibilities include:
1. Extracting the context of the post.
2. Identifying the platform where the post originates (to be scraped via link).
3. Analyzing the social link included in the post.

The output will be integrated into a Directus instance, so it is essential that we achieve clarity in the shared message and ensure conformity to the specified data model.

## OBJECTIVE ##
Our team at Directus will send a message every time they share content on social media. We will then input this information into a Directus instance, necessitating strict adherence to the post requirements. Your goal is to extract specific information from the post, focusing on the following:
1. Determine if the shared content includes a link to a social post on LinkedIn or X. If the link does not lead to either of these platforms, please disregard the post as it is not relevant for this task.
2. Identify the platform of the social post based on the URL provided, checking specifically for indicators such as LinkedIn or X.com.

## OUTPUT ##
Based on your analysis of the post, please provide the following in your output:
1. Identify the platform as either "X" or "LinkedIn" based on the presence of a relevant link.
2. Supply the cleaned URL, ensuring that any UTM parameters or extraneous query strings are removed from the link

## CONTEXT ##
You are a data cleaning expert tasked with analyzing and cleaning Slack posts in order to effectively understand and evaluate a specific post. Your responsibilities include:
1. Extracting the context of the post.
2. Identifying the platform where the post originates (to be scraped via link).
3. Analyzing the social link included in the post.

The output will be integrated into a Directus instance, so it is essential that we achieve clarity in the shared message and ensure conformity to the specified data model.

## OBJECTIVE ##
Our team at Directus will send a message every time they share content on social media. We will then input this information into a Directus instance, necessitating strict adherence to the post requirements. Your goal is to extract specific information from the post, focusing on the following:
1. Determine if the shared content includes a link to a social post on LinkedIn or X. If the link does not lead to either of these platforms, please disregard the post as it is not relevant for this task.
2. Identify the platform of the social post based on the URL provided, checking specifically for indicators such as LinkedIn or X.com.

## OUTPUT ##
Based on your analysis of the post, please provide the following in your output:
1. Identify the platform as either "X" or "LinkedIn" based on the presence of a relevant link.
2. Supply the cleaned URL, ensuring that any UTM parameters or extraneous query strings are removed from the link

## CONTEXT ##
You are a data cleaning expert tasked with analyzing and cleaning Slack posts in order to effectively understand and evaluate a specific post. Your responsibilities include:
1. Extracting the context of the post.
2. Identifying the platform where the post originates (to be scraped via link).
3. Analyzing the social link included in the post.

The output will be integrated into a Directus instance, so it is essential that we achieve clarity in the shared message and ensure conformity to the specified data model.

## OBJECTIVE ##
Our team at Directus will send a message every time they share content on social media. We will then input this information into a Directus instance, necessitating strict adherence to the post requirements. Your goal is to extract specific information from the post, focusing on the following:
1. Determine if the shared content includes a link to a social post on LinkedIn or X. If the link does not lead to either of these platforms, please disregard the post as it is not relevant for this task.
2. Identify the platform of the social post based on the URL provided, checking specifically for indicators such as LinkedIn or X.com.

## OUTPUT ##
Based on your analysis of the post, please provide the following in your output:
1. Identify the platform as either "X" or "LinkedIn" based on the presence of a relevant link.
2. Supply the cleaned URL, ensuring that any UTM parameters or extraneous query strings are removed from the link

This outputs two fields: Social Platform (LinkedIn or X) and Cleaned URL (stripped of tracking params).

Step 4: Post to Directus




Directus Backend

Zapier sends the cleaned data to our Marketing instance of Directus and a specific collection via the API. The schema is simple:

Field

Type

Notes

id

uuid

Auto-generated

platform

string

linkedin or x

url

string

Cleaned post URL

slack_user

string

Who shared it

created_at

datetime

When logged

Step 5: The Dashboard (Claude Code)

For the frontend, I started with a quick sketch in tldraw:




Tldrawui

Then I described what I wanted to Claude Code:

  • Leaderboard with medal rankings (🥇🥈🥉)

  • Monthly filtering

  • Click names to drill into individual posts

  • Dark mode

Claude Code scaffolded the Directus integration, built the aggregation logic, wired up filtering. In all, ~6 files of actual code. Nothing fancy, just boring readable components.




Claude Code Recap

Stack: Next.js 16 + Directus SDK + Tailwind. Deployed to Vercel.

What I Learned




Scoreboard Screen
  1. AI actions in Zapier are underrated. GPT-4o-mini is cheap and fast enough for real-time automations

  2. Directus as a quick backend. Didn't need a full database setup, just spun up a collection

  3. Claude Code for internal tools. Describe what you want, get working code

Not every internal tool needs to be complex to be useful. This took an afternoon and saves hours of manual tracking.