Avtrz
BlogCustomer stories
Customer stories6 min read

How Trigify filled in 240K contacts overnight

Their sales team had a wall of grey initials. One image link, one ship, and Monday's pipeline looked like a different product.

Priya Shah··6 min read
240K
contacts · 1 ship · 7 hours
contacts · 1 ship · 7 hours

Trigify builds go-to-market software for sales teams. Every Monday, thousands of those teams open it, look at a list of prospects, and see a wall of grey initials where the people should be.

Their VP of Product, Anika, sent us a screen recording. It was forty seconds long. Most of it was her scrolling. None of it had a face.

“Our whole product is about people,” she said at the end. “It does not feel like it is about people.” She asked if we could help her ship something before the next sales kickoff. We had seven days.

What we changed (basically nothing)

Trigify already rendered an avatar component in every prospect row. It accepted an imageUrl prop with a hard-coded fallback to initials on a grey square. The component had eighteen tests. Nobody wanted to touch it.

They didn’t have to. The integration was a one-line URL change on the prop:

TypeScriptcopy / paste
<Avatar
  src={`https://avtrz.dev/v1/avatar?username=${contact.handle}&size=64`}
  fallback={initialsOf(contact.name)}
/>
One prop. One URL. No SDK to add, no migration to plan.

Avtrz returns a 200 with the contact’s public business profile photo if one exists, and a 404 if not. The avatar component already handled 404s; it dropped to initials. So the change was: ship the URL, change nothing else, and let the existing fallback do its job.

What happened on Monday

They deployed the change on a Saturday afternoon. By Monday morning, the cache had warmed against their entire contact graph.

240K
contacts hydrated
91%
got a real photo
−12s
per page

91% is a higher hit rate than we usually quote. Trigify’s contacts skew senior, and senior people maintain their public profiles. Your number will be different. The shape of the result won’t.

We didn’t ship a new feature. We made the feature we already had look like itself.
Anika, VP Product · Trigify

The boring lessons we keep relearning

Don’t replace the avatar component

Every GTM tool has one. Every tool’s one is load-bearing in surprising ways: virtualized lists, hover popovers, mass-action checkboxes, drag handles. Replacing it is a quarter of work. Passing it a different URL is half an hour.

Cache before the demo, not during

Trigify warmed the cache by running a single batch script against their contact handles the day before sales kickoff. It took 18 minutes. The kickoff demo loaded instantly because the photos were already at the edge. Without that, the first few clicks would have been on cold caches and the room would have noticed.

Let the initials stay as the fallback

We see this often: a team integrates Avtrz, then quietly removes their initials fallback because it is “not needed anymore.” Six weeks later a CDN hiccup or a 404 lands them on a grey square. Keep the fallback. It costs nothing and it keeps the surface stable.

What we’d do differently next time

Two things. First, we’d preload the avatar URL on row hover, not row mount, on virtualized lists. Trigify’s pages have 50 rows visible and 800 in the buffer; we were pre-fetching too aggressively for the first day and one of our nodes briefly rate-limited their warm-up job. We fixed it on our side; you should hover-prefetch on yours.

Second, we’d move the “new people found” counter into Trigify’s own dashboard from day one. They were checking the Avtrz console more than we’d expect. Most of that data should live in the customer’s own surface. We are shipping that as an embeddable widget in May.

If you want to do the same thing

Three steps, in this order. They take an afternoon.

One: create a workspace and an API key. Add your production domain to the allow-list so the key never leaves your origin.

Two: swap your existing avatar src for an Avtrz URL on a single page first, usually the contact detail page. Watch it for a day.

Three: roll it to your list views, email digests, agent outputs, and anywhere else a row of people appears. The cache is already warm by then; everything feels fast.

That’s the whole story. One image link, one weekend, one GTM tool that finally looks like it is about people.

Written by
Priya Shah
Customer engineering at Avtrz. Lives in customer calls; secretly likes spreadsheets.
More posts
Twice a month, max

Get the next customer story in your inbox.

Engineering posts, customer stories, and the occasional changelog. Unsubscribe in one click.

How Trigify filled in 240K contacts overnight · Avtrz Blog