Skip to main content

User Profile Card

A detailed profile view combining images, metrics, and contact information in a polished card layout.

Best for: CRM dashboards, customer support tools, user management interfaces

Key techniques: Profile images, metric cards, external links (email, maps), status badges with dynamic classes

User Profile Card Example

Template Code

<style>
.record-card {
max-width: 600px;
background-color: white;
border-radius: 12px;
border: 1px solid #E5E7EB;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
overflow: hidden;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}

.record-header {
display: grid;
grid-template-columns: auto 1fr;
gap: 1.5rem;
padding: 1.5rem;
background-color: #F9FAFB;
border-bottom: 1px solid #E5E7EB;
}

.record-image {
width: 80px;
height: 80px;
border-radius: 50%;
object-fit: cover;
border: 3px solid white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

.record-info {
display: flex;
flex-direction: column;
justify-content: center;
gap: 0.375rem;
}

.record-name {
font-size: 1.25rem;
font-weight: 600;
color: #111827;
line-height: 1.3;
}

.record-email {
font-size: 0.875rem;
color: #6366F1;
text-decoration: none;
display: flex;
align-items: center;
gap: 0.375rem;
}

.record-email:hover {
text-decoration: underline;
}

.record-location {
font-size: 0.875rem;
color: #6B7280;
display: flex;
align-items: center;
gap: 0.375rem;
}

.record-location a {
color: inherit;
text-decoration: none;
}

.record-location a:hover {
color: #4B5563;
text-decoration: underline;
}

.record-metrics {
display: grid;
grid-template-columns: repeat(3, 1fr);
border-bottom: 1px solid #E5E7EB;
}

.metric-item {
padding: 1.25rem;
text-align: center;
border-right: 1px solid #E5E7EB;
}

.metric-item:last-child {
border-right: none;
}

.metric-value {
font-size: 1.5rem;
font-weight: 700;
color: #111827;
line-height: 1.2;
}

.metric-label {
font-size: 0.75rem;
color: #6B7280;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-top: 0.25rem;
}

.record-details {
padding: 1.5rem;
}

.detail-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 0;
border-bottom: 1px solid #F3F4F6;
}

.detail-row:last-child {
border-bottom: none;
}

.detail-label {
font-size: 0.875rem;
color: #6B7280;
font-weight: 500;
}

.detail-value {
font-size: 0.875rem;
color: #111827;
font-weight: 600;
}

.status-badge {
display: inline-block;
padding: 0.25rem 0.75rem;
border-radius: 9999px;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
}

.status-badge.active,
.status-badge.ACTIVE {
background-color: #DEF7EC;
color: #047857;
}

.status-badge.vip,
.status-badge.VIP {
background-color: #FEF3C7;
color: #92400E;
}

.status-badge.new,
.status-badge.NEW {
background-color: #DBEAFE;
color: #1E3A8A;
}

@media (max-width: 640px) {
.record-header {
grid-template-columns: 1fr;
text-align: center;
gap: 1rem;
}

.record-image {
margin: 0 auto;
}

.record-email,
.record-location {
justify-content: center;
}

.record-metrics {
grid-template-columns: 1fr;
}

.metric-item {
border-right: none;
border-bottom: 1px solid #E5E7EB;
}

.metric-item:last-child {
border-bottom: none;
}
}
</style>

<div class="record-card">

<!-- Header Section -->
<div class="record-header">
<img src="{{ rows.0.`Profile Image URL`.raw }}" alt="{{ rows.0.`Full Name`.formatted }}" class="record-image" />

<div class="record-info">
<div class="record-name">{{ rows.0.`Full Name` }}</div>

<a href="mailto:{{ rows.0.`Email`.raw }}" class="record-email">
<span>✉️</span>
{{ rows.0.`Email` }}
</a>

<div class="record-location">
<span>📍</span>
<a href="https://www.google.com/maps/search/?api=1&query={{ rows.0.`Location`.raw }}" target="_blank" rel="noopener">
{{ rows.0.`Location` }}
</a>
</div>
</div>
</div>

<!-- Metrics Section -->
<div class="record-metrics">
<div class="metric-item">
<div class="metric-value">{{ rows.0.values.`Total Orders` }}</div>
<div class="metric-label">Total Orders</div>
</div>

<div class="metric-item">
<div class="metric-value">{{ rows.0.values.`Lifetime Value` }}</div>
<div class="metric-label">Lifetime Value</div>
</div>

<div class="metric-item">
<div class="metric-value">{{ rows.0.values.`Avg Order Value` }}</div>
<div class="metric-label">Avg Order</div>
</div>
</div>

<!-- Details Section -->
<div class="record-details">
<div class="detail-row">
<span class="detail-label">Status</span>
<span class="status-badge {{ rows.0.`Status`.raw }}">{{ rows.0.`Status` }}</span>
</div>

<div class="detail-row">
<span class="detail-label">Member Since</span>
<span class="detail-value">{{ rows.0.`Member Since` }}</span>
</div>

<div class="detail-row">
<span class="detail-label">Last Order</span>
<span class="detail-value">{{ rows.0.`Last Order Date` }}</span>
</div>

<div class="detail-row">
<span class="detail-label">User ID</span>
<span class="detail-value">{{ rows.0.`User ID` }}</span>
</div>
</div>

</div>

Required Data Fields

FieldTypeDescription
Full NameDimensionUser's full name
EmailDimensionEmail address
LocationDimensionCity or address
Profile Image URLDimensionURL to profile photo
StatusDimensionStatus value (e.g., "active", "vip", "new")
Member SinceDimensionRegistration date
Last Order DateDimensionMost recent order date
User IDDimensionUnique identifier
Total OrdersMeasureOrder count
Lifetime ValueMeasureTotal customer value
Avg Order ValueMeasureAverage order amount

Sample Data

Import this data into Holistics to use: sample-data-record-lookup.csv

This template displays only the first row:

User ID,Email,Full Name,Profile Image URL,Location,Status,Member Since,Last Order Date,Total Orders,Lifetime Value,Avg Order Value
1005,[email protected],Chaisson Barb,https://i.pravatar.cc/150?img=5,Berlin,VIP,Jun 2022,Nov 2024,45,6230,138
1002,[email protected],Ciubal Samuel,https://i.pravatar.cc/150?img=2,Mumbai,Active,Mar 2023,Oct 2024,18,2890,161
1004,[email protected],Homes Dale,https://i.pravatar.cc/150?img=4,Medan,Active,Feb 2024,Oct 2024,12,1680,140

Customization Tips

  • Add more status badge styles by creating new CSS classes (e.g., .status-badge.churned)
  • The status badge automatically applies styling based on the raw value matching a CSS class
  • Use rows.0 (dot notation) for single-record displays
  • External links use .raw values to avoid formatting issues in URLs

Let us know what you think about this document :)