Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions config/casestudies/transfergo.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
id: transfergo
company:
name: TransferGo
description: |
Founded in 2012, TransferGo provides international money transfer services with a focus on accessibility, speed, and affordability for migrants. The company operates in over 160 countries and serves millions of customers globally, ensuring fast and reliable cross-border payments.
customers: "over 8 million"
industry: Fintech / Payments
website: https://www.transfergo.com/
logo: /img/casestudies/transfergo/logo.svg
contact:
- name: Zbigniew Malcherczyk
link: https://www.linkedin.com/in/zbigniew-malcherczyk/

challenges: |
In 2021, TransferGo's Backend Guild identified challenges with documenting both REST and asynchronous APIs. Different teams used varying approaches, which created inconsistencies and difficulties in maintaining up-to-date API schemas. As services grew past 50 and more events were introduced, inconsistencies and invalid schemas emerged. Additionally, YAML-based documentation was not user-friendly, making discoverability and adoption harder. With over 300 channels, visibility into published events and ensuring trust across distributed systems became a significant challenge.

solution: |
TransferGo adopted the AsyncAPI specification to unify documentation practices and improve developer experience. Instead of an API-first approach, they introduced a code-first documentation model using an internal library. This library leverages Reflection in PHP and .NET to generate AsyncAPI schemas directly from DTOs, reducing duplication and ensuring consistency.

To maintain schema quality, TransferGo integrated AsyncAPI CLI into their pipelines, automating validation and optimization of large schemas. They also contributed to schema scoring capabilities in AsyncAPI CLI, encouraging teams to keep docs clean and consistent.

For accessibility, TransferGo automated publishing of AsyncAPI definitions using GitHub Actions. Schemas are stored in S3 and surfaced through Port.io Developer Portal, providing a single interface for developers to browse, search, and visualize service contracts.

At scale, TransferGo introduced [Event Catalog](https://www.eventcatalog.dev/) to map their 300+ channels and highlight integration gaps. For testing, they adopted contract testing with [Microcks](https://microcks.io/) and LocalStack, integrated into Jenkins CI, enabling validation of service interactions against AsyncAPI definitions. Finally, their internal CLI tool, API Guardian, helps ensure schema coverage by comparing AsyncAPI definitions with deployed infrastructure.

technical:
languages:
- php
- .NET
- C#
- javascript
- node.js
frameworks:
- Symfony
- ASP.NET
protocols:
- SNS
- SQS
- Kafka
brokers: AWS SNS/SQS, Kafka
testing: |
Contract testing with Microcks and LocalStack integrated into Jenkins CI, validating message-driven services without requiring cloud infrastructure.
architecture: |
TransferGo relies heavily on an Event Driven Architecture, ensuring instant money transfers and reliable asynchronous communication. Services publish and consume events primarily through AWS Simple Notification Service (SNS) and Simple Queue Service (SQS), with Kafka used where applicable. Symfony-based workers handle incoming messages, while validation and coverage tools ensure contracts remain trustworthy.
codegen: |
Code-first generation of AsyncAPI schemas is achieved via internal libraries in PHP and .NET. These libraries automatically reflect DTOs into message payload definitions, ensuring up-to-date and consistent documentation across services.

schemas:
description: JSON Schema derived from DTOs.
storage: Schemas are generated from service code and stored in GitHub repositories, with automated publishing to an S3 bucket for central access.
registry: None, schemas are distributed via S3 and Port.io Developer Portal.
versioning: Versioning is handled per repository and service team, aligned with service releases.
validation: AsyncAPI CLI is used to validate schemas for correctness and optimize file sizes. Jenkins CI pipelines enforce schema validation during builds.

asyncapi:
usecase: |
TransferGo uses AsyncAPI to unify async API documentation across services, generate schemas from code via internal libraries, validate and optimize schemas in CI pipelines, publish schemas to Port.io Developer Portal for centralized access, build an [Event Catalog](https://www.eventcatalog.dev/) for visibility into 300+ channels, and support contract testing with [Microcks](https://microcks.io/).
versions:
- '2.6.0'
- '3.0.0'
storage: |
Schemas are stored in GitHub repositories and automatically published to an S3 bucket. Port.io Developer Portal ingests these schemas to make them accessible to developers.
editing: |
Documentation is maintained via code-first libraries. GitHub Actions pipelines validate and publish updates automatically. AsyncAPI CLI is used for validation, optimization, and schema scoring.
maintainers: |
Backend Guild maintains the internal libraries and tooling, while individual service teams maintain their own AsyncAPI schemas.
audience:
internal: true
external: false
extensions: |
None
documentation: |
AsyncAPI React component was initially used for rendering. Today, Port.io Developer Portal serves as the central platform, presenting all AsyncAPI schemas in a unified, visual interface.
bindings: |
None
tools: |
TransferGo relies on [AsyncAPI CLI](https://github.com/asyncapi/cli), [AsyncAPI React](https://github.com/asyncapi/asyncapi-react), [AsyncAPI Modelina](https://github.com/asyncapi/modelina), [Port.io Developer Portal](https://www.port.io/), [Event Catalog](https://www.eventcatalog.dev/), [Microcks](https://microcks.io/), [LocalStack](https://github.com/localstack/localstack), and API Guardian (internal CLI).
fullExample: resources/casestudies/transfergo/asyncapi.yaml
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

Verify fullExample path resolves (likely needs leading slash)

The AsyncAPI file appears at public/resources/casestudies/transfergo/asyncapi.yaml. Config usually references it as “/resources/...”.

If needed:

-  fullExample: resources/casestudies/transfergo/asyncapi.yaml
+  fullExample: /resources/casestudies/transfergo/asyncapi.yaml

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Configured path in YAML:"
rg -nC0 -N '^  fullExample:' config/casestudies/transfergo.yml

echo
echo "Check if file exists at repo path:"
fd -a 'asyncapi.yaml' public | sed 's#^# - #'

echo
echo "Recommend updating to a leading-slash web path if the site expects public-rooted URLs."

Length of output: 425


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Listing fullExample in other case study configs:"
rg -n "fullExample:" config/casestudies/*.yml

Length of output: 321


Prefix fullExample paths with a leading slash in all case study configs

Each AsyncAPI file lives under public/resources/…, so fullExample must start with “/resources/…”.

  • config/casestudies/transfergo.yml (line 78)
    - fullExample: resources/casestudies/transfergo/asyncapi.yaml
    + fullExample: /resources/casestudies/transfergo/asyncapi.yaml
  • config/casestudies/hdi.yml (line 232)
    - fullExample: resources/casestudies/hdi/asyncapi.yaml
    + fullExample: /resources/casestudies/hdi/asyncapi.yaml
  • config/casestudies/adeo.yml (line 278)
    - fullExample: resources/casestudies/adeo/asyncapi.yaml
    + fullExample: /resources/casestudies/adeo/asyncapi.yaml
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
fullExample: resources/casestudies/transfergo/asyncapi.yaml
fullExample: /resources/casestudies/transfergo/asyncapi.yaml
🤖 Prompt for AI Agents
In config/casestudies/transfergo.yml around line 78, the fullExample path is
missing a leading slash; update the value from
"resources/casestudies/transfergo/asyncapi.yaml" to start with
"/resources/casestudies/transfergo/asyncapi.yaml" so the path points to
public/resources/...; apply the same leading-slash convention to other case
study config files noted in the review.

additionalResources: See [slides from 2023](https://drive.google.com/file/d/1t7tYMr8FMRInaZV0lWod1QfDuhhSjwBJ/view?usp=sharing) that show early days of adoption
4 changes: 4 additions & 0 deletions public/img/casestudies/transfergo/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading