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:
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.
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.”
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.