# AppsFlyer: send event

The **AppsFlyer: send event** Point template sends a [server-to-server in-app event](https://dev.appsflyer.com/hc/reference/events_android) to AppsFlyer for every traveler that passes this step. The event carries the attribution of the install, so the journey step shows up in AppsFlyer reports and can be handed to ad networks as a conversion.

<Aside type="caution" icon="setting" title="Developer assistance needed">
The point doesn't set the AppsFlyer ID tag by itself. Without app code that reads `AppsFlyerLib.getAppsFlyerUID()` and saves it as a Pushwoosh tag after the AppsFlyer SDK starts, the tag stays empty on every device and the point [skips every traveler](#travelers-with-no-appsflyer-id-are-skipped). Share this with your development team:

<Tabs>
<TabItem label="Java">
```java
String appsflyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(context);
Pushwoosh.getInstance().setTags(new TagsBundle.Builder().putString("AppsFlyer ID", appsflyerId).build());
```
</TabItem>
<TabItem label="Swift">
```swift
let appsflyerId = AppsFlyerLib.shared().getAppsFlyerUID
Pushwoosh.sharedInstance().setTags(["AppsFlyer ID": appsflyerId])
```
</TabItem>
</Tabs>
</Aside>

## Configure the point

1. Drag **AppsFlyer: send event** from the **Integrations** section onto the canvas.
2. Double-click the point and enter a **Step Name**.
3. In **App ID**, enter the app identifier from AppsFlyer: **App Settings**, `id123456789` for iOS or `com.example.app` for Android.
4. In **Dev key**, enter the app's dev key from **App Settings > Dev Key**. It's stored masked, like a webhook secret header — Pushwoosh never displays or returns it once saved, and it never appears in the point's stored request or in the [Calls log](/product/customer-journey/journey-elements/channels/webhook/#calls-log).
5. In **Event name**, enter the name the event should get in AppsFlyer, a standard one (`af_purchase`, `af_complete_registration`) or your own (`paywall_reached`).
6. In **Tag with the AppsFlyer ID**, type the name of the Pushwoosh tag that holds `AppsFlyerLib.getAppsFlyerUID()`, saved by the app after the AppsFlyer SDK starts. This field takes a tag name as plain text — Point templates don't have the tag picker that a channel like Push or Email uses for its own tag fields. AppsFlyer matches a server event to an install only by this ID, so get the tag name exactly right.
7. Optional. In **Customer user ID**, keep the default `{{device:user_id}}` to send the Pushwoosh user ID, or enter your own identifier to reconcile in AppsFlyer.
8. Optional. In **Currency**, keep the default `USD` or enter another ISO 4217 code. It's sent as `eventCurrency`.
9. Optional. In **Event value**, add the parameters to send as AppsFlyer's `eventValue` payload — see [key/value fields](/product/customer-journey/journey-elements/integrations/#configuring-list-and-keyvalue-fields). Use `af_revenue` for the amount, and `af_content_id` or `af_content_type` for your own. There's no separate numeric revenue field: `af_revenue` is a string cell in this table, the same as any other parameter, and it takes a macro like `{{tag:Price}}`. A blank cell isn't sent.
10. Click **Save**.

## Travelers with no AppsFlyer ID are skipped

If the tag in **Tag with the AppsFlyer ID** is empty for a traveler, Pushwoosh doesn't send a request for that traveler at all — it isn't a failed request, since AppsFlyer would have nothing to match the event to.

That traveler still continues to the next step in the journey.

A failed request (one that did have an AppsFlyer ID) drops the traveler from the journey instead — see [Errors and failed requests](/product/customer-journey/journey-elements/integrations/#errors-and-failed-requests).