
Published July 16, 2025
Go at American Express Today: Seven Key Learnings
Since adopting Go in late 2016, our teams at American Express have seen the language live up to its promises of performance, efficiency, and scalability. But that impact didn’t come without learning curves.
Along the way, we uncovered key insights that have helped shape how we use Go across our platforms today. This post focuses on what we’ve learned and how those lessons continue to influence our engineering practices.
1. Evolving with Go Modules
One of the first friction points we encountered was around dependency management.
In the early days, Go’s dependency management was simplistic but very challenging to use within an enterprise network behind corporate firewalls and internet proxies.
The introduction of Go Modules changed that. Today, versioning and managing dependencies is far more straightforward—even for large, complex projects. It’s now common place to see Go support within most enterprise developer tools.
2. Concurrency: Easy to Start, Hard to Master
Go’s concurrency model was a major draw but putting it into production wasn’t without its headaches.
While it is easy to create goroutines, cleanup and coordination across goroutines was an area that initially presented some challenges.
These challenges pushed us to adopt stronger patterns for managing concurrent processes. We’ve embraced the sync & context packages along with ensuring the use of defer to avoid goroutine leaks.
These patterns now help us write more robust and maintainable Go code. And to ensure we catch concurrency bugs early, we enable Data Race Detection in our tests by default.
3. Training for Idiomatic Go
Despite Go’s relative simplicity, ramping up teams took effort.
As Go was a new language for many of our engineers, we invested in internal training programs and developed documentation that helps teams write idiomatic Go from day one.
This foundation has helped us scale usage in the enterprise beyond our initial adopting platforms.
4. Standardizing with Frameworks and Toolkits
As adoption grew, so did the need for structure.
To standardize and optimize how we build services we created a “Paved Road” or “Golden Framework” which has built-in support for non-functional requirements like observability, asynchronous health checks, graceful shutdown, and security.
This paved road is built from our “Off-Roading” toolkit. The toolkit is a collection of internal packages that often wrap open-source packages tailored to our unique internal infrastructure. A great example of this toolkit is our logging package, which wraps the standard library structured logger slog to support our internal logging format, enable asynchronous logging with buffering and truncation policies.
5. Performance Tooling Built-in
Go can help our engineers spend less time debugging performance issues and more time building.
Out of the box, Go comes with native tools like pprof, and benchmark tests which have streamlined performance profiling.
The low garbage collection pause times, and efficient use of goroutines, is a perfect fit for our low latency, high scale payments platforms.
Not to mention how Go’s efficient resource usage has helped us reduce infrastructure overhead.
6. Integrating with Observability Tools
We were initially concerned about Go’s compatibility with our observability stack. Thankfully, integration was smoother than expected. Metrics, tracing, and logging worked well with our existing tools, with little customization required—a critical win for production reliability.
7. Fostering a Thriving Internal Community
One of the most valuable outcomes of Go adoption has been the emergence of a strong internal community. Nearly 1,000 engineers actively collaborate in our internal Go channel, supported by monthly meetups, internal conferences, and the continuously evolving paved road framework, off-roading toolkit, & documentation.
This peer-driven culture has been essential in refining best practices and driving innovation.
Looking Ahead
Go is now a core part of our engineering toolkit for our performance critical platforms, and we continue to invest in making it even more powerful for our teams. By listening to developers, solving real challenges, and sharing what works, we’ve created a sustainable path for Go at American Express—one built on continuous learning and community-driven growth.
You can read our original Choosing Go blog here.
About the Author

Recent Articles

Benjamin Cane
Distinguished Engineer
Choosing Go at American Express
A look into how American Express decided to use Go for some of its most critical applications.

Benjamin Cane
Distinguished Engineer
Do Not Run Dockerized Applications as Root
Understand how to run Dockerized applications as non-root and why it is important.