Skip to content

Chrome Extensions

fb-messenger-crm

Turns Facebook Messenger into a lightweight CRM. Create custom labels (Clients, VIP, Hot Leads, New Leads, Friends, or whatever else you need), assign them to threads, and see colored badges next to contact names in both the left chat list and the conversation header. Everything lives in chrome.storage.local — no accounts, no sync, no server.

  • You are running outreach through Messenger and need to see at a glance who is a paying client vs cold lead vs friend.
  • You manage multiple Pages or accounts through one Messenger and your inbox is a sea of identical-looking conversations.
  • You want a Facebook-side tag that does not depend on a connected GHL contact existing first.
  1. Load unpacked from ~/apps/fb-messenger-crm/extension/ at chrome://extensions.
  2. Pin the extension to the toolbar.
  3. Click the popup → create your first label (or use the seeded defaults: Clients, VIP, Hot Leads, New Leads, Friends).
  4. Open messenger.com. Each thread row in the left list shows badges for any labels assigned to that conversation.
  5. In an open conversation, click the Labels button in the header to assign or unassign labels via a checklist picker.
RequirementWhere
Manifest permissionsstorage, tabs, activeTab; hosts: messenger.com, facebook.com/messages, 127.0.0.1 (logger)
chrome-log-receiver running~/apps/cc/chrome-log-receiver.py under launchd
{
labels: [{ id, name, color, createdAt }],
assignments: { threadKey: [labelId, ...] }
}

threadKey = the path segment after /t/ in the Messenger URL.

  • Repo: ~/apps/fb-messenger-crm/
  • Entry files: extension/manifest.json, popup.html, popup.js, background.js, content.js, content.css, selectors.js, storage.js
  • Logs: ~/apps/cc/logs/fb-messenger-crm.log
  • Selectors live in extension/selectors.js — the content script also inlines a copy because it cannot import ES modules. When Messenger changes its DOM, fix both.
  • No GHL sync. Labels here are private to the extension. A Phase 3 idea is to mirror them onto a custom field on the matching GHL contact.
  • No notes per thread yet. Phase 2.
  • Build 1.