# Goal completed

Learn how to track when a user completes a goal.

This event tracks the completion of a goal, also known as a conversion.

> **When should I track this event?**
>
> Track this event whenever a user reaches a goal that you want to measure, like submitting a form or placing an order.

## Implementation

Here is an example of how to track this event:

**JavaScript**

```javascript
import croct from '@croct/plug';

croct.track('goalCompleted', {
  goalId: 'signup'
});
```

**HTML**

```html
<!DOCTYPE html>
<html>
<head>
  <title>My awesome application</title>
  <script src="https://cdn.croct.io/js/v1/lib/plug.js"></script>
  <script>croct.plug({appId: 'APPLICATION_ID'});</script>
</head>
<body>
  <script>
    const track = () => croct.track('goalCompleted', {
        goalId: 'signup'
      });
  </script>
  <button onclick="track()">Trigger</button>
</body>
</html>
```

**React — JavaScript**

```jsx
import {useCroct} from '@croct/plug-react';

export function Example() {
const croct = useCroct();

const track = () => croct.track('goalCompleted', {
    goalId: 'signup'
  });

return (<button onClick={track}>Trigger</button>);
}
```

**React — TypeScript**

```typescript
import {useCroct} from '@croct/plug-react';
import type {ReactElement} from 'react';

export function Example(): ReactElement {
const croct = useCroct();

const track = () => croct.track('goalCompleted', {
    goalId: 'signup'
  });

return (<button onClick={track}>Trigger</button>);
}
```

**Next — JavaScript**

```jsx
import {useCroct} from '@croct/plug-next';

export function Example() {
const croct = useCroct();

const track = () => croct.track('goalCompleted', {
    goalId: 'signup'
  });

return (<button onClick={track}>Trigger</button>);
}
```

**Next — TypeScript**

```tsx
import {useCroct} from '@croct/plug-next';
import type {ReactElement} from 'react';

export function Example(): ReactElement {
const croct = useCroct();

const track = () => croct.track('goalCompleted', {
    goalId: 'signup'
  });

return (<button onClick={track}>Trigger</button>);
}
```

**Vue — JavaScript**

```vue
<script setup>
import {useCroct} from '@croct/plug-vue'

const croct = useCroct()

const track = () => croct.track('goalCompleted', {
    goalId: 'signup'
  })
</script>

<template>
  <button @click="track">Trigger</button>
</template>
```

**Vue — TypeScript**

```vue
<script setup lang="ts">
import {useCroct} from '@croct/plug-vue'

const croct = useCroct()

const track = (): void => croct.track('goalCompleted', {
    goalId: 'signup'
  })
</script>

<template>
  <button @click="track">Trigger</button>
</template>
```

**Nuxt — JavaScript**

```vue
<script setup>
const croct = useCroct()

const track = () => croct.track('goalCompleted', {
    goalId: 'signup'
  })
</script>

<template>
<button @click="track">Trigger</button>
</template>
```

**Nuxt — TypeScript**

```vue
<script setup lang="ts">
const croct = useCroct()

const track = (): void => croct.track('goalCompleted', {
    goalId: 'signup'
  })
</script>

<template>
<button @click="track">Trigger</button>
</template>
```

## Input properties

These are the supported properties:

- `goalId`: `string`

  A unique identifier for the goal. For example, "signup", "purchase", "newsletter-subscription".

  The value must be between 3 and 100 characters long, containing only letters, digits, and separators ("-", "\_" or ":"), starting and ending with letters or digits.

- `currency`: `string` (optional)

  The currency in which the monetary value is expressed, such as "USD" or "EUR".

  We recommend using the 3-letter currency codes defined by the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) standard. For currencies having no official recognition in the standard, consider using ISO-like codes adopted locally or commercially, such as "XBT" for BitCoin.

- `value`: `number` (optional)

  The monetary value associated with completing the goal.

  This can represent an estimated value or a symbolic value. For example, if the sales team converts 10% of newsletter sign-ups into customers, with each customer averaging a $500 transaction, the value of each newsletter sign-up would be $50 (10% of $500).

  The value must be non-negative.

## Processed properties

This event has no processed properties.

## Payload examples

Below is an input example for this event:

**Basic payload**

```json
{
  "goalId": "signup"
}
```

**Full payload**

```json
{
  "goalId": "signup",
  "currency": "USD",
  "value": 50
}
```

**Processed payload**

```json
{
  "type": "goalCompleted",
  "goalId": "signup",
  "currency": "USD",
  "value": 50
}
```

## Explore

- [Analytics](/reference/analytics): Learn how to analyze your dashboards.
- [Event-based audiences](/reference/cql/expressions/events/event-types/goal-completed): Learn how to create audiences based on this event.
