Skip to main content
Use this guide after SDK Integration Testing. It helps you decide whether an action is a custom event or a payment, then confirms that Linkrunner records it correctly.

Choose the right method

The event name alone is not enough. If purchase_completed represents a real transaction, send it as a payment. If it only represents a funnel step with no authoritative transaction, send it as a custom event.Do not send the same transaction as both a revenue-bearing custom event and a payment. This can duplicate revenue in downstream ad networks.

Usually send as a custom event

  • Product view, search, add to cart, and checkout started
  • Content view, level completion, and referral
  • Purchase initiated when it only marks the start of checkout
  • Payment failure shown for product analytics when you do not need a payment record

Usually send with capturePayment

  • Completed purchase
  • First or second payment
  • One-time or recurring payment
  • Subscription creation or renewal with a charge
  • Wallet top-up or funds withdrawal
  • A failed or cancelled transaction when you need it recorded with PAYMENT_FAILED or PAYMENT_CANCELLED
If you record a failed or cancelled payment, send its final state once. Linkrunner deduplicates payments by the combination of type and payment_id, so a later call with the same combination is ignored.

Before you test

  • Complete the click → install → signup flow so the test user is attributed.
  • Use the same user_id that your app registered through signup.
  • Generate a fresh payment_id for each real transaction.
  • Send amount as a number in one reporting currency.
  • Pick one source for each payment, either the app SDK or your backend.
  • For server-side tests, generate a server key from Settings → Data APIs.

Test flow

1

Create traceable test values

Use values that you can find in the Events Log:
Use a new payment_id every time you test a new transaction.
2

Send a custom event control

Send a non-payment action such as checkout_started through your SDK’s trackEvent method or the Event Capture API.
A successful API request returns a captured-event response.
3

Send a completed payment

Send the actual transaction through your SDK’s capturePayment method or the Revenue Tracking API.
A successful API request returns HTTP 201.
4

Verify both records in Linkrunner

Open Events → Events Log, then filter by your test user or event name.
  • checkout_started appears as a custom event.
  • The transaction appears as a payment event.
  • The payment row contains the expected Amount, Payment ID, and Payment Status.
5

Verify payment deduplication

Send the same payment again with the same type and payment_id.Expected result: the Events Log still contains one payment for that combination. Linkrunner records the first request and ignores later duplicates.
6

Verify a new transaction

Send another completed payment with a new payment_id, such as lr_test_payment_002.Expected result: the Events Log contains a second payment. If it does not, confirm that the new transaction did not reuse the previous payment_id.

Expected classification

Test Meta Purchase forwarding

Use this section only when the payment must reach Meta Commerce Manager.
  1. In Linkrunner, map the payment type you send, such as DEFAULT or FIRST_PAYMENT, to Meta’s standard Purchase event.
  2. Include the required event_data fields for Purchase, including product IDs, contents, content_type, value, currency, num_items, and order_id.
  3. Send a new payment with a new payment_id.
  4. Check Meta Commerce Manager → Events. The real-time hit should appear within about 15 minutes. Full reporting can take a few days.
See Meta Commerce Manager for the full ecommerce payload.

Test payment removal

Remove one test payment using its payment_id:
The API does not define a partial-refund adjustment flow. Contact support before using removePayment for a partial refund.
Do not test removal with only user_id unless you intend to remove every payment attributed to that user.

Troubleshooting

Confirm the device completed the attribution test flow and that the event uses the same user_id registered through signup.
The app or backend sent it through trackEvent or /capture-event. Send authoritative transactions through capturePayment or /capture-payment instead.
Check whether it reused the same type and payment_id as an earlier transaction. Linkrunner treats that combination as a duplicate.
Confirm the app and backend are not both sending the transaction with different payment IDs. Choose one source, or use the same stable payment ID for safe retries.
Linkrunner keeps the first record for a type and payment_id combination. Send the final payment state once instead of sending initiated and completed states with the same combination.
Confirm the payment type is mapped to Purchase, the ecommerce payload includes every required field, and the test has had at least 15 minutes to reach Meta Events Manager.
Need help? Contact support@linkrunner.io