> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trophy.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Cómo Crear una Funcionalidad de Logros

> Aprende a usar Trophy para añadir una funcionalidad de logros a tu aplicación web o móvil.

Esta guía describe el proceso completo para añadir una funcionalidad de logros a tu aplicación web o móvil usando Trophy.

A modo ilustrativo, usaremos el ejemplo de una plataforma de estudio que utiliza logros para incentivar y recompensar a los usuarios por ver tarjetas de memoria.

<Tip>
  Para ver un ejemplo completamente funcional de esto en la práctica, consulta la [demostración en vivo](https://examples.trophy.so) o el [repositorio de github](https://github.com/trophyso/example-study-platform/tree/demo).
</Tip>

<h2 id="pre-requisites">
  Requisitos previos
</h2>

* Una cuenta de [Trophy](https://app.trophy.so/sign-up)
* Aproximadamente 10 minutos

<h2 id="trophy-setup">
  Configuración de Trophy
</h2>

En Trophy, las [Métricas](/es/features/metrics) son los componentes fundamentales de la gamificación y modelan las diferentes interacciones que los usuarios realizan con tu producto.

En esta guía, la interacción que nos interesa es `flashcards-viewed`, pero puedes crear una métrica que mejor represente la interacción en torno a la cual quieres construir logros.

En el panel de Trophy, dirígete a la [página de métricas](https://app.trophy.so/metrics) y crea una métrica.

<Frame>
  <video autoPlay muted loop playsInline className="w-full aspect-video" src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/create_new_metric.mp4?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=8e66d7276d9648d449c4556340febf45" data-path="assets/guides/achievements-feature/create_new_metric.mp4" />
</Frame>

Una vez que hayas creado tu métrica, dirígete a la [página de logros](https://app.trophy.so/achievements) y crea los logros que desees. Puedes encontrar todos los detalles sobre los tipos de logros y los diferentes casos de uso en la [documentación de logros](/es/features/achievements).

Para los propósitos de esta guía, hemos configurado un par de logros basados en un número creciente de tarjetas volteadas:

* 10 tarjetas de estudio
* 50 tarjetas de estudio
* 100 tarjetas de estudio
* 250 tarjetas de estudio
* 1,000 tarjetas de estudio

También hemos configurado algunos logros relacionados con [Rachas](/es/features/streaks), pero no entraremos en detalle sobre estos en esta guía.

<Tip>
  Para una guía completa sobre cómo agregar una función de rachas a tu aplicación web o móvil, consulta
  nuestra [guía completa](/es/guides/how-to-build-a-streaks-feature).
</Tip>

En Trophy rastrear las interacciones de usuarios enviando [Events](/es/features/events) desde tu código a las API de Trophy contra una métrica específica.

Cuando se registran eventos para un usuario específico, cualquier logro vinculado a la métrica especificada se **completará automáticamente** si se cumplen los requisitos.

Esto es lo que hace que crear experiencias gamificadas con Trophy sea tan fácil: realiza todo el trabajo por ti detrás de escena.

<h2 id="installing-trophy-sdk">
  Instalar Trophy SDK
</h2>

Para interactuar con Trophy desde tu código, utilizarás el Trophy SDK disponible en la mayoría de los [lenguajes de programación](/es/api-reference/client-libraries) principales.

Instala el Trophy SDK:

<CodeGroup>
  ```bash Node theme={null}
  npm install @trophyso/node
  ```

  ```bash Ruby theme={null}
  gem install trophy_api_client
  ```

  ```bash Python theme={null}
  pip install trophy
  ```

  ```bash PHP theme={null}
  composer require trophyso/php
  ```

  ```bash Java (Gradle) theme={null}
  implementation 'so.trophy:trophy-java:1.0.0'
  ```

  ```bash Java (Maven) theme={null}
  <dependency>
    <groupId>so.trophy</groupId>
    <artifactId>trophy-java</artifactId>
    <version>1.0.0</version>
  </dependency>
  ```

  ```bash Go theme={null}
  go get github.com/trophy-so/trophy-go
  ```

  ```bash .NET (C#) theme={null}
  // .NET Core CLI
  dotnet add package Trophy

  // Nuget Package Manager
  nuget install Trophy

  // Visual Studio
  Install-Package Trophy
  ```
</CodeGroup>

A continuación, obtén tu clave API desde la [página de integración](https://app.trophy.so/integration) de Trophy y agrégala como una variable de entorno **solo del lado del servidor**.

```bash theme={null}
TROPHY_API_KEY='*******'
```

<Warning>
  Asegúrate de **no** exponer tu clave API en código del lado del cliente.
</Warning>

<h2 id="tracking-user-interactions">
  Rastrear Interacciones de Usuarios
</h2>

Para rastrear un evento (interacción de usuario) contra tu métrica, utiliza la [API de cambio de métrica](/es/api-reference/endpoints/metrics/send-a-metric-change-event).

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://app.trophy.so/api/metrics/flashcards-flipped/event \
       -H "X-API-KEY: <apiKey>" \
       -H "Content-Type: application/json" \
       -d '{
    "user": {
      "id": "18",
      "email": "user@example.com",
      "tz": "Europe/London"
    },
    "value": 750
  }'
  ```

  ```typescript Node theme={null}
  trophy.metrics.event("flashcards-flipped", {
    user: {
      id: "18",
      email: "user@example.com",
      tz: "Europe/London",
    },
    value: 750,
  });
  ```

  ```python Python theme={null}
  client.metrics.event(
      key="flashcards-flipped",
      user=EventRequestUser(
          id="18",
          email="user@example.com",
          tz="Europe/London",
      ),
      value=750.0,
  )
  ```

  ```php PHP theme={null}
  $user = new EventRequestUser([
      'id' => '18',
      'email' => 'user@example.com'
  ]);

  $request = new MetricsEventRequest([
      'user' => $user,
      'value' => 750
  ]);

  $trophy->metrics->event("flashcards-flipped", $request);
  ```

  ```java Java theme={null}
  MetricsEventRequest request = MetricsEventRequest.builder()
        .user(
          EventRequestUser.builder()
            .id("18")
            .email("user@example.com")
            .build()
        )
        .value(750)
        .build();

  EventResponse response = client.metrics().event("flashcards-flipped", request);
  ```

  ```go Go theme={null}
  response, err := client.Metrics.Event(
      "flashcards-flipped",
      &api.MetricsEventRequest{
          User: &api.EventRequestUser{
              Id: "18",
              Email: "user@example.com",
          },
          Value: 750,
      },
  )
  ```

  ```csharp C# theme={null}
  var user = new EventRequestUser {
     Id = "18",
     Email = "user@example.com"
  };

  var request = new MetricsEventRequest {
     User = user,
     Value = 750
  };

  await trophy.Metrics.EventAsync("flashcards-flipped", request);
  ```

  ```ruby Ruby theme={null}
  result = client.metrics.event(
    :key => 'flashcards-flipped',
    :user => {
      :id => '18',
      :email => 'user@example.com'
    },
    :value => 750
  )
  ```
</CodeGroup>

La respuesta a esta llamada API es el conjunto completo de cambios a cualquier funcionalidad que hayas creado con Trophy, incluidos los logros que se desbloquearon como resultado del evento.

```json Response [expandable] theme={null}
{
  "metricId": "d01dcbcb-d51e-4c12-b054-dc811dcdc623",
  "eventId": "0040fe51-6bce-4b44-b0ad-bddc4e123534",
  "total": 750,
  "achievements": [
    {
      "id": "5100fe51-6bce-6j44-b0hs-bddc4e123682",
      "trigger": "metric",
      "metricId": "5100fe51-6bce-6j44-b0hs-bddc4e123682",
      "metricName": "Flashcards Flipped",
      "metricValue": 500,
      "name": "500 Flashcards Flipped",
      "description": "Write 500 words in the app.",
      "achievedAt": "2020-01-01T00:00:00Z"
    }
  ],
  ...
}
```

Valida que esto funciona verificando el [panel de control](https://app.trophy.so) de Trophy.

<Frame>
  <img height="200" width="100%" noZoom src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/top-users.png?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=bb6f28c04ba9e48d6bf8f93ed1271337" data-path="assets/guides/achievements-feature/top-users.png" />
</Frame>

<h2 id="displaying-achievements">
  Mostrar Logros
</h2>

Tienes varias opciones para mostrar logros en tu aplicación. Aquí veremos las opciones más comunes.

<h3 id="pop-up-notifications">
  Notificaciones Emergentes
</h3>

Podemos usar la respuesta del [API de cambio de métrica](/es/api-reference/endpoints/metrics/send-a-metric-change-event) para mostrar notificaciones emergentes (o 'toasts') cuando los usuarios completan logros.

Aquí hay un ejemplo de esto en acción:

```ts Achievement Completed Pop-up theme={null}
// Sends event to Trophy
const response = await viewFlashcard();

if (!response) {
  return;
}

// Show toasts if the user has unlocked any new achievements
response.achievements.forEach((achievement) => {
  toast({
    title: achievement.name,
    description: achievement.description,
    image: {
      src: achievement.badgeUrl,
      alt: achievement.name,
    },
  });
});
```

<Frame>
  <video autoPlay muted loop playsInline className="w-full aspect-video" src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/displaying-toasts.mp4?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=9735f2e5ac0e72e25aacd43264673b4f" data-path="assets/guides/achievements-feature/displaying-toasts.mp4" />
</Frame>

<Tip>
  Si quieres reproducir efectos de sonido, usa el [API de Audio HTML5](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) y siéntete libre de usar estos [archivos de audio](https://github.com/trophyso/example-study-platform/tree/demo/public/sounds) que recomendamos.
</Tip>

<h3 id="displaying-user-achievements">
  Mostrar Logros de Usuario
</h3>

Para obtener todos los logros que un usuario ha completado, usa el [API de logros de usuario](/es/api-reference/endpoints/users/get-a-users-completed-achievements).

<CodeGroup>
  ```bash cURL theme={null}
  curl --request GET \
    --url https://api.trophy.so/v1/users/{id}/achievements \
    --header 'X-API-KEY: <api-key>'
  ```

  ```typescript Node theme={null}
  trophy.users.achievements("user-id");
  ```

  ```python Python theme={null}
  client.users.achievements("user-id")
  ```

  ```php PHP theme={null}
  $trophy->users->achievements("user-id");
  ```

  ```java Java theme={null}
  UserAchievementsResponse response = client.users().achievements("user-id");
  ```

  ```go Go theme={null}
  response, err := client.Users.Achievements("user-id")
  ```

  ```csharp C# theme={null}
  await trophy.Users.AchievementsAsync("user-id");
  ```

  ```ruby Ruby theme={null}
  result = client.users.achievements(
    :id => 'user-id'
  )
  ```
</CodeGroup>

<Tip>
  También puedes obtener logros incompletos al mismo tiempo pasando `includeIncomplete` como `'true'`.
</Tip>

<Frame>
  <video autoPlay muted loop playsInline className="w-full aspect-video" src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/displaying_trophy_cabinet.mp4?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=987adecfd9abee5294ac6487fe76d402" data-path="assets/guides/achievements-feature/displaying_trophy_cabinet.mp4" />
</Frame>

<h3 id="displaying-all-achievements">
  Mostrar Todos los Logros
</h3>

Si en cambio quieres mostrar todos los logros que has configurado en Trophy como parte de una interfaz de usuario globalmente accesible que no esté vinculada a un usuario en particular, puedes usar el [API de todos los logros](/es/api-reference/endpoints/achievements/all-achievements).

<CodeGroup>
  ```bash cURL theme={null}
  curl --request GET \
    --url https://api.trophy.so/v1/achievements \
    --header 'X-API-KEY: <api-key>'
  ```

  ```typescript Node theme={null}
  trophy.achievements();
  ```

  ```python Python theme={null}
  client.achievements()
  ```

  ```php PHP theme={null}
  $trophy->achievements();
  ```

  ```java Java theme={null}
  UserAchievementsResponse response = client.achievements();
  ```

  ```go Go theme={null}
  response, err := client.Achievements()
  ```

  ```csharp C# theme={null}
  await trophy.AchievementsAsync();
  ```

  ```ruby Ruby theme={null}
  result = client.achievements()
  ```
</CodeGroup>

<h3 id="achievement-completion-stats">
  Estadísticas de Finalización de Logros
</h3>

Tanto el API de logros de usuario como el API de todos los logros incluyen estadísticas de finalización como `completions` (el número de usuarios que han completado un logro) y `rarity` (el porcentaje de usuarios que han completado un logro).

<Frame>
  <img height="200" width="100%" noZoom src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/completion-stats.png?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=bf1d3fc81dbf0631bb477d06660f405c" data-path="assets/guides/achievements-feature/completion-stats.png" />
</Frame>

<h2 id="analytics">
  Analíticas
</h2>

La [página de logros](https://app.trophy.so/achievements) en Trophy muestra cuántos usuarios han completado cada logro que has configurado.

<Frame>
  <img height="200" width="100%" noZoom src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/check_user_completions.png?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=c597555608e7f166887376d94ab648f6" data-path="assets/guides/achievements-feature/check_user_completions.png" />
</Frame>

Además, la página de analíticas de cualquier métrica en Trophy incluye un gráfico que muestra el progreso de los usuarios a través de tus Logros.

<Frame>
  <img height="200" width="100%" noZoom src="https://mintcdn.com/trophy/2khPIyZFxPyE7xgA/assets/guides/achievements-feature/achievement_completions.png?fit=max&auto=format&n=2khPIyZFxPyE7xgA&q=85&s=5770aaffd83fdecc356167753edfcf0c" data-path="assets/guides/achievements-feature/achievement_completions.png" />
</Frame>

<h2 id="get-support">
  Obtener Soporte
</h2>

¿Quieres ponerte en contacto con el equipo de Trophy? Comunícate con nosotros por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte!
