> For the complete documentation index, see [llms.txt](https://assetstore.essentialkit.voxelbusters.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://assetstore.essentialkit.voxelbusters.com/features/billing-services/playmaker.md).

# PlayMaker

Build an in-app store UI, purchase products, and restore eligible purchases using PlayMaker custom actions.

## Key pattern (listeners)

* Register `BillingServicesOnTransactionStateChange` in a state that stays active **before** calling `BillingServicesBuyProduct`. This listener is what fires `purchasingEvent` / `purchasedEvent` / `failedEvent` / `deferredEvent` and caches transactions for `BillingServicesGetTransactionInfo`.
* Register `BillingServicesOnRestorePurchasesComplete` in a state that stays active **before** calling `BillingServicesRestorePurchases`. This listener is what fires completion events and caches restore results for extractor actions.
* After `purchasedEvent`, use `BillingServicesGetTransactionInfo` and require `receiptVerificationState == Success` before granting content. The plugin performs local verification by default, so `Purchased` without successful verification should be treated as invalid.

## Actions (high level)

* Store setup: `BillingServicesInitializeStore`, `BillingServicesGetInitializeStoreSuccessResult`, `BillingServicesGetInitializeStoreError`, `BillingServicesCanMakePayments`
* Product listing/UI: `BillingServicesGetStoreProductInfo`, `BillingServicesIsProductPurchased`
* Purchase flow: `BillingServicesBuyProduct`, `BillingServicesGetBuyProductError`, `BillingServicesOnTransactionStateChange`, `BillingServicesGetTransactionInfo`
* Restore flow: `BillingServicesRestorePurchases`, `BillingServicesOnRestorePurchasesComplete`, `BillingServicesGetRestorePurchasesSuccessResult`, `BillingServicesGetRestorePurchasesError`, `BillingServicesGetRestoredTransactionInfo`
* Manual completion / verification: `BillingServicesGetTransactions`, `BillingServicesSetReceiptVerificationState`, `BillingServicesFinishTransactions`

## AutoFinishTransactions

* **ON (default):** simplest flow. Grant content only when `purchasedEvent` has `receiptVerificationState == Success`. No manual finishing needed.
* **OFF (advanced):** required for server-side receipt verification. Verify `receipt` from `BillingServicesGetTransactionInfo`, then call `BillingServicesSetReceiptVerificationState(transactionId, Success/Failed)` and finish with `BillingServicesFinishTransactions`.

## Use cases

Start here: `use-cases/README.md`
