โ 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
M public/audience.htmlM server.js
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 โ