Best approach for a scalable gifting system with Developer Products?

Hello!

I’m trying to design a gifting system for my Roblox game, but I’ve never implemented one before, so I’m looking for advice on the architecture rather than just code.

My game is split into multiple services, for example:

  • AuraService
  • MultiplierUpgrades
  • TreadmillService
  • etc.

Each feature registers its own Developer Products with a central DeveloperProductsService.

For example, a service registers products like this:

function MultiplierUpgrades:Init()
    for _, productId in pairs(MultiplierUpgradeProducts) do
        DevProductsHandler:Register(productId, handler)
    end
end

Another service does something similar:

DevProductsService:Register(auraData.ProductId, function(player)
    return AurasService:AddAura(player, categoryName, auraName)
end)

Then I have a central DeveloperProductsService that stores handlers by ProductId and calls the correct one inside MarketplaceService.ProcessReceipt.

function DeveloperProductsService:Register(productId, handler)
    productsById[productId] = handler
end

MarketplaceService.ProcessReceipt = function(receiptInfo)
    local handler = productsById[receiptInfo.ProductId]
    return handler(player, ...)
end

What I want to add

I want to add a gifting UI where a player can select another player and gift items.

The challenge is that not every gift maps directly to a single Developer Product.

For example, multiplier upgrades only have one Gift button. The server should determine which multiplier tier the target player needs and grant the correct upgrade after purchase.

So I need something scalable that works across different systems, instead of writing separate gifting logic for every service.

My questions

  • What’s the recommended architecture for a gifting system with Developer Products?

  • Should gifting be handled by a separate GiftService, or should every existing service implement its own gift logic?

  • How would you structure the flow from:

    • selecting a recipient,
    • purchasing,
    • receiving the ProcessReceipt,
    • and granting the reward to the target player instead of the purchaser?
  • How do you usually pass gift context (recipient, gift type, etc.) to ProcessReceipt, considering it only receives the receipt information?

I’m mainly looking for design recommendations and patterns that scale well as more Developer Products and services are added.