Blog / How-to
How to build an influencer database that stays clean (spreadsheet or CRM)
Most influencer lists start as a quick spreadsheet and turn into a mess within a quarter: the same creator appears three times under different handles, follower counts are a year old, and nobody remembers why a row says "maybe". This guide shows you how to set up an influencer database that stays usable as it grows, in Google Sheets, Airtable, a CRM or a real database: one record per person, each social account stored separately, every link normalized, and a note of when and how you learned each fact.
Start with what the database is for
Before you add a column, write one sentence about the decisions the database must support. "Find creators for our skincare campaigns and track who we paid" leads to a different design than "map every fitness creator in Germany for a market study". The purpose tells you which fields you need, how often to refresh them, and what not to collect.
Also decide who will use it and what you will filter by. More users means stricter edit rules, and anything you filter on (niche, country, platform, status) needs its own column with a fixed list of values, not free text.
One row per creator, not per account
The most useful design decision is to separate the person from their accounts. A creator such as "Maya Okafor" might run @mayabakes on Instagram, @mayabakes_ on TikTok and a YouTube channel called Maya in the Kitchen. If each is a row, you will email her three times and count her reach three times.
Use two tables (two tabs in a spreadsheet, or two objects in a CRM): creators, one row per person, and accounts, one row per social profile pointing back to a stable creator ID that never changes, even if every handle does.
Creators table
| Column | Example | Notes |
|---|---|---|
| creator_id | CR-000142 | Stable, never reused. Do not use a handle as the ID. |
| display_name | Maya Okafor | How they present themselves publicly. |
| primary_niche | Baking | Pick from a fixed list. |
| country | GB | ISO 3166 two-letter code keeps filters consistent. |
| business_email | hello@example.com | Only if published for business enquiries. |
| status | Contacted | See the pipeline section below. |
| owner | Priya | Who on your team is responsible for the relationship. |
| updated_at | 2026-10-23 | Set automatically if your tool allows. |
Accounts table
| Column | Example | Notes |
|---|---|---|
| account_id | AC-000387 | Stable ID for the account row. |
| creator_id | CR-000142 | Links to the creators table. |
| platform | Fixed list: instagram, tiktok, youtube, x, and so on. | |
| handle | mayabakes | Normalized: lowercase, no @. |
| platform_user_id | UCxxxxxxxxxxxxxxxxxxxxxx | When you can get it. Survives handle changes. |
| canonical_url | https://www.instagram.com/mayabakes/ | Built from the handle in one fixed format. |
| followers | 48200 | A number, not "48.2K". |
| followers_as_of | 2026-10-20 | The date you saw that number. |
| link_confidence | high | How sure you are this account belongs to this creator. |
| link_evidence | Linked from her YouTube About page | Why you believe it. |
If you import and export with CSV, keep the headers identical to the columns so nothing gets renamed along the way:
creator_id,display_name,primary_niche,country,languages,business_email,status,owner,notes,created_at,updated_at
account_id,creator_id,platform,handle,platform_user_id,canonical_url,followers,followers_as_of,link_confidence,link_evidence,sourceNormalize every profile URL and handle
Most duplicates are one profile written in different ways. https://instagram.com/MayaBakes?igsh=abc123, instagram.com/mayabakes/ and @mayabakes are one account, but a spreadsheet sees three values. Normalize on the way in, every time.
- Step 1Trim and lowercase
Remove spaces before and after the value and convert it to lowercase. Instagram, TikTok and X handles are not case sensitive, so
MayaBakesandmayabakesare the same account. - Step 2Strip tracking and extras
Cut everything after
?or#(share links often add parameters such asigsh,utm_sourceoris_from_webapp), and remove the trailing slash. - Step 3Extract the handle
Pull out just the handle and drop a leading
@. Store it in thehandlecolumn. Reject links that point to a post, Reel or video (for example/p/,/reel/or/video/) rather than a profile, or look up the author's profile first. - Step 4Rebuild a canonical URL
Generate the URL from the handle in one fixed format per platform. Never paste the original share link into the canonical column.
- Step 5Check for an existing match
Search the accounts table for the same platform and handle (or platform user ID). If it exists, update that row instead.
| Platform | Messy input | Handle | Canonical form |
|---|---|---|---|
| https://Instagram.com/MayaBakes/?igsh=abc123 | mayabakes | https://www.instagram.com/mayabakes/ | |
| TikTok | https://www.tiktok.com/@MayaBakes_?lang=en | mayabakes_ | https://www.tiktok.com/@mayabakes_ |
| X | https://twitter.com/MayaBakes | mayabakes | https://x.com/mayabakes |
| YouTube | https://youtube.com/@MayaInTheKitchen/videos | @mayainthekitchen | https://www.youtube.com/@mayainthekitchen |
YouTube needs extra care: a channel can be reached by an @handle, a /channel/UC... URL with its permanent channel ID, or older /c/ and /user/ URLs. The channel ID survives handle changes, so store it in platform_user_id and treat it as the key for YouTube rows.
In Google Sheets you can do the Instagram and TikTok extraction with a formula. With the raw link in column A, these return a lowercase handle or a blank cell when the link does not match:
=IFERROR(LOWER(REGEXEXTRACT(A2, "(?i)instagram\.com/([a-z0-9._]+)")), "")
=IFERROR(LOWER(REGEXEXTRACT(A2, "(?i)tiktok\.com/@([a-z0-9._]+)")), "")Build the canonical URL in the next column, for example ="https://www.instagram.com/" & B2 & "/". The Instagram formula also matches post links and returns p, so filter for values such as p, reel, explore and stories and fix those rows by hand.
Deduplicate, merge and record evidence
Same person, different handles
Maya is @mayabakes on Instagram and @mayabakes_ on TikTok, so matching on handle alone will not connect them. Look for evidence that ties the accounts together: bio links, a link-in-bio page or website listing both, the same business email, or one account mentioning the other. When you confirm a match, attach both account rows to the same creator_id.
Same handle, different people
@jordanruns on Instagram and @jordanruns on X may be two unrelated people. Treat a handle match as a lead to check, never as proof.
When you do merge two creator records:
- Pick the older
creator_idas the survivor, so existing references keep working. - Move every account row, note and deal from the duplicate to the survivor.
- Keep the duplicate ID in a
merged_intocolumn (or a small merge log) instead of deleting it outright, so you can trace old exports. - Resolve conflicts by keeping the most recent dated value.
Record evidence and confidence for every link
The link between a person and an account is a claim, and claims go wrong. A teammate a year from now needs to know why you believed the TikTok account was Maya's. Two columns on each account row cover it: link_confidence and link_evidence.
| Confidence | What counts as evidence | What to do |
|---|---|---|
| High | The creator links the account from another verified or established profile, or from their own website. | Use it for outreach and reporting. |
| Medium | Same name, photo and niche, plus a matching link-in-bio page or cross-mentions, but no direct link. | Use it, but check before signing a deal. |
| Low | Similar handle or name only. | Keep it out of reports until you confirm it. |
Write evidence another person can check, such as "Linked from YouTube About page, checked 2026-10-20", not "looks like her". If a tool found the match, store its score and reason, and still review low-confidence matches yourself.
Fields to track, refresh dates and status
Follower counts, engagement and even handles change, so every metric column gets a matching _as_of date. Set a refresh rule for each kind of field:
| Field | Changes | Suggested refresh |
|---|---|---|
| Followers / subscribers | Constantly | Before any outreach or report, and on a fixed cycle such as monthly for active prospects. |
| Engagement rate or average views | With every post | When you shortlist the creator for a campaign. Record how you calculated it. |
| Handle and canonical URL | Occasionally | When a link stops working, and on each metrics refresh. Platform user IDs help here. |
| Niche, country, language, email | Rarely | Once or twice a year, and the email before each outreach round. |
| Status and deal history | With every interaction | Update at the time it happens. |
For fields you report on, append to a small metrics_history table (account ID, date, followers, views) instead of overwriting, so you can show growth.
Use a simple status pipeline
Use a dropdown with a short list and add a status_changed_at date so you can see stale records. One pipeline that works for most teams:
| Status | Meaning |
|---|---|
| Prospect | Fits the brief, not yet vetted. |
| Vetted | Content, audience and brand safety checked. |
| Contacted | First message sent. |
| In conversation | Discussing terms. |
| Contracted | Agreement signed. |
| Live | Content published. |
| Completed | Delivered and paid. |
| Not a fit / Declined | Closed, with the reason. |
| Do not contact | They asked not to be contacted. Keep only what you need to honor that. |
Privacy basics for creator data
Creators are people, and an influencer database is a store of personal data even when every field came from a public profile. This is general information, not legal advice; check with your own counsel for your situation. A few principles apply under most privacy laws, including the EU and UK GDPR and California's CCPA:
- Have a lawful basis. Under the GDPR, businesses often rely on legitimate interests for B2B outreach, which means you should be able to explain why the processing is necessary and does not override the creator's interests. Document that reasoning.
- Collect only public, relevant data. Stick to what a creator publishes for professional purposes. Never store home addresses or family details.
- Respect platform terms. Many platforms prohibit automated scraping without permission, so prefer official APIs, manual research or tools that use permitted access.
- Tell people and honor requests. The GDPR generally requires you to inform people about data collected from other sources, at the latest when you first contact them. When a creator asks to see or delete their data, a single
creator_idlets you find every row about them. - Delete what you no longer need. Set a retention rule, for example removing prospects you never contacted after a set period, and run it.
- Limit access. Share edit rights only with people who need them.
Spreadsheet, CRM or database: when to move
| Option | Good for | Signs you have outgrown it |
|---|---|---|
| Spreadsheet | A small team and a few thousand creators. | Linking tabs by ID gets painful, or people overwrite each other. |
| No-code database (Airtable and similar) | Linked tables, dropdowns and views without code. | You hit record or automation limits. |
| CRM | Outreach, email logging, tasks and deal stages for a team. | You need custom analysis, or the CRM fights the person/account split. |
| SQL database (Postgres and similar) | Large datasets, research, apps and API access. | Rarely outgrown, but needs someone to maintain it. |
Whatever you choose, keep the same two tables and IDs. Then moving to a CRM or database later is an import, not a rebuild.
Filling in the accounts table faster
Finding each creator's other accounts is usually the slowest part of building the accounts table. sociallinks.dev takes one Instagram, TikTok, YouTube or X profile URL and returns the creator's accounts on other platforms with a confidence score and the evidence for each match, which maps directly onto the link_confidence and link_evidence columns above. Its bulk mode takes up to 500 profile links and returns a spreadsheet.
FAQ
What columns should an influencer database have?
At minimum, a creators table with a stable creator ID, name, niche, country, contact route, status and owner, plus an accounts table with platform, normalized handle, canonical URL, follower count and the date you recorded it. Add confidence and evidence columns for each account link.
How do I avoid duplicate influencers in a spreadsheet?
Normalize every profile link before adding it: lowercase it, strip query strings and trailing slashes, extract the handle and rebuild one canonical URL. Then check the accounts table for the same platform and handle before inserting a row. For the same person on different handles, link the accounts to one creator ID based on evidence such as bio links.
Should I use a spreadsheet or a CRM for influencer management?
A spreadsheet is fine for a small team and a few thousand creators, as long as you use IDs and separate tabs for creators and accounts. Move to a CRM when a team needs shared email logging and deal stages, and to a database for large-scale analysis or API access.
How often should I update follower counts?
Refresh them before any outreach or report, and on a regular cycle such as monthly for creators you are actively considering. Always store the date next to the number. A follower count without an "as of" date cannot be trusted in a report.
Is it legal to store data about influencers?
Generally you can store public, professional information about creators, but privacy laws such as the GDPR and CCPA still apply to it as personal data. You typically need a lawful basis, should collect only what you need, inform people where required and honor deletion requests. This is not legal advice, so check the rules that apply to your business.
How do I handle a creator who changes their handle?
Keep the creator ID and account ID the same and update the handle and canonical URL on the existing account row. If you stored the platform's user ID, such as a YouTube channel ID, use it to confirm it is the same account. Note the old handle in a history field so older exports still make sense.