Compras
Developer Products
Embrulhe o seu ProcessReceipt com RoMetrics.wrapProcessReceipt. Note o . (função, não método):
MarketplaceService.ProcessReceipt = RoMetrics.wrapProcessReceipt(function(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
return Enum.ProductPurchaseDecision.NotProcessedYet
end
-- entregue o item e salve antes de confirmar
return Enum.ProductPurchaseDecision.PurchaseGranted
end)O que o wrapper garante:
- Seu handler roda em
pcalle a decisão que ele retorna é devolvida para a Roblox, sem alteração. - Se o seu handler der erro, o wrapper loga e retorna
NotProcessedYet: a Roblox tenta de novo depois e o jogador não perde o item. - A venda só é contada com
PurchaseGranted: preço =CurrencySpent, id do recibo =PurchaseId, nome viaGetProductInfo(cache de 10 min). - Cada
PurchaseIdé contado uma vez por servidor, mesmo que a Roblox repita o recibo. - O rastreio roda em
task.spawn, sem atrasar a resposta. - Funciona mesmo se
initnão rodou: o handler executa normalmente, só não há rastreio.
Só um ProcessReceipt
A Roblox aceita um único ProcessReceipt por jogo: a última atribuição vence, sem aviso. Se você usa um roteador de produtos, embrulhe o roteador inteiro, na linha onde o seu jogo já atribui. Nunca crie um segundo ProcessReceipt só para o RoMetrics. O plugin (aba Vendas) acha essa linha e embrulha com 1 clique.
Seu jogo já tem o próprio ProcessReceipt? Use trackReceipt
Se preferir não embrulhar, chame RoMetrics.trackReceipt(receiptInfo) logo antes de devolver PurchaseGranted. Use um ou outro, nunca os dois para a mesma compra:
-- dentro do ProcessReceipt que o seu jogo já tem
grantItem(player, receiptInfo.ProductId)
RoMetrics.trackReceipt(receiptInfo)
return Enum.ProductPurchaseDecision.PurchaseGrantedSe um produto for comprado e nada for registrado em 30 s, o SDK avisa uma vez no Output: sinal de que o ProcessReceipt embrulhado foi substituído por outro.
Game Passes
Automático. O SDK escuta MarketplaceService.PromptGamePassPurchaseFinished e conta quando wasPurchased = true, com nome e preço vindos de GetProductInfo(id, Enum.InfoType.GamePass) (cache e 3 tentativas).
Compras de Game Pass feitas fora do jogo (pelo site) não passam pelo servidor e não aparecem.
Assinaturas
Ainda não rastreadas.
No dashboard
Cada venda aparece em segundos em Receita e no feed Ao vivo, com país, plataforma e a campanha que trouxe o jogador, e pode disparar notificação (Discord, push no celular ou no navegador).