> ## 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>

También puedes crear [logros de aniversario](/es/features/achievements#anniversary-achievements) que se desbloquean cuando los usuarios alcanzan hitos anuales desde su fecha de registro.

En Trophy rastreas las interacciones de los usuarios enviando [Eventos](/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 construir experiencias gamificadas con Trophy sea tan fácil: hace todo el trabajo por ti entre bastidores.

<h2 id="installing-trophy-sdk">
  Instalación del SDK de Trophy
</h2>

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

Instala el SDK de Trophy:

<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 de 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 de API en código del lado del cliente.
</Warning>

<h2 id="tracking-user-interactions">
  Rastreo de 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/events/submit-a-metric-event).

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

  ```typescript Node theme={null}
  import type { EventResponse } from "@trophyso/node/api";

  const response: EventResponse = await trophy.metrics.event(
    "flashcards-flipped",
    {
      user: {
        id: "18",
        email: "user@example.com",
        tz: "Europe/London",
      },
      value: 750,
      idempotencyKey: "flashcard-view-42",
    }
  );
  ```

  ```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 de API es el conjunto completo de cambios en cualquier característica que hayas construido con Trophy, incluyendo cualquier logro que se haya desbloqueado 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 revisando el [panel](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">
  Visualización de 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 de la [API de cambio de métrica](/es/api-reference/endpoints/events/submit-a-metric-event) para mostrar notificaciones emergentes (o 'toasts') cuando los usuarios completen logros.

Aquí tienes 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 deseas reproducir efectos de sonido, utiliza la [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 del Usuario
</h3>

Para obtener todos los logros que un usuario ha completado, utiliza la [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 deseas 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 utilizar la [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 Completado de Logros
</h3>

Tanto la API de logros de usuario como la API de todos los logros incluyen estadísticas de completado 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">
  Análisis
</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 análisis 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? Contáctanos por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte!


## Related topics

- [Logros](/es/features/achievements.md)
- [Cómo Crear un Rastreador de Fitness Gamificado](/es/guides/gamified-fitness-platform.md)
- [Inicio rápido](/es/getting-started/quickstart.md)
- [Crear logros](/es/admin-api/endpoints/achievements/create-achievements.md)
- [Facturación](/es/account/billing.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.