[object Object]

โ† back to Rentv

Audience: CRM contacts now surface their REAL enriched LinkedIn (โœ“) instead of a search guess โ€” fetchCrmContacts pulls linkedin_url; the ๐Ÿ‘ค action links the actual profile when we have it, falls back to search otherwise

49947825d83601e727833420395f12a2c4ce8512 ยท 2026-08-05 16:30:15 -0700 ยท Steve Abrams

Files touched

Diff

commit 49947825d83601e727833420395f12a2c4ce8512
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 5 16:30:15 2026 -0700

    Audience: CRM contacts now surface their REAL enriched LinkedIn (โœ“) instead of a search guess โ€” fetchCrmContacts pulls linkedin_url; the ๐Ÿ‘ค action links the actual profile when we have it, falls back to search otherwise
---
 public/audience.html | 2 +-
 server.js            | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/public/audience.html b/public/audience.html
index e75b6d42..2505ef24 100644
--- a/public/audience.html
+++ b/public/audience.html
@@ -117,7 +117,7 @@ function contactActions(c){
     // CRM contacts drill into their full pr-intelligence record (Steve's "every data point hrefs deeper" rule)
     c.origin==='crm'?A('/admin/pr-intelligence/people?id='+encodeURIComponent(String(c.id).replace(/^crm-/,'')),'๐Ÿ—‚๏ธ','Open in CRM'):'',
     c.origin==='crm'&&c.firm?A('/admin/pr-intelligence/organizations?q='+encodeURIComponent(c.firm),'๐Ÿข','Firm in CRM'):'',
-    A(LI_P(c.name,c.firm),'๐Ÿ‘ค','LinkedIn'),
+    A(c.linkedin||LI_P(c.name,c.firm),'๐Ÿ‘ค',c.linkedin?'LinkedIn โœ“':'LinkedIn'),
     c.firm?A(LI_C(c.firm),'๐Ÿข','Firm'):'',
     (c.listings&&c.listings[0]&&c.listings[0].listing_url&&/^https?:/i.test(c.listings[0].listing_url))?A(c.listings[0].listing_url,'๐Ÿ”—','Listing'):'',
     A(GOOG(c.name+' '+(c.firm||'')+' commercial real estate'),'๐Ÿ”Ž','Google'),
diff --git a/server.js b/server.js
index 980d5574..e5b60db0 100644
--- a/server.js
+++ b/server.js
@@ -1532,7 +1532,7 @@ async function fetchCrmContacts() {
   // The pr-intelligence CRM people joined to their org (category + metros). Degrades to [] if rentv_pr is down.
   try {
     return await prDb.rows(
-      `SELECT p.id, p.full_name, p.public_work_email AS email, p.exact_title, p.department,
+      `SELECT p.id, p.full_name, p.public_work_email AS email, p.exact_title, p.department, p.linkedin_url,
               o.display_name AS firm, o.organization_type, o.metros, o.state_presence, p.created_at
          FROM pr_people p JOIN pr_organizations o ON o.id = p.organization_id
         WHERE p.lifecycle_status NOT IN ('duplicate','suppressed')
@@ -1580,7 +1580,7 @@ function buildAudience(subs, subleaseRows, crmPeople) {
       id: 'crm-' + x.id, origin: 'crm',
       persona: isPR ? 'PR / Comms Contact' : 'CRE Professional',
       name: (x.full_name || '').trim() || '(contact)', email: x.email || '', phone: '',
-      firm: x.firm || '', title: x.exact_title || '',
+      firm: x.firm || '', title: x.exact_title || '', linkedin: x.linkedin_url || '',
       interest: [ORG_TYPE_LABEL[x.organization_type] || '', (x.metros || []).join(' ')].filter(Boolean).join(' '),
       source: 'crm', organization_type: x.organization_type || null, metros: x.metros || [],
       created_at: x.created_at || null, listings: [],

โ† e8fc556f PR intel: paginate linkedin-enrich target pool (Cody cycle 3  ยท  back to Rentv  ยท  Boomer voice/byline: on-air name is BOOM not Bloom (Steve) โ€” ce6805c1 โ†’