How to make a “Grow a Garden”-style game in Roblox Studio

Plant seeds, let them grow in real time — even while players are away — then harvest and sell. The growth system behind garden games, as a complete script.

Updated November 1, 20268 min read

Garden games are calm tycoons built on real time: a seed takes minutes or hours to grow, so players come back later. Store when something was planted instead of counting seconds, and growth keeps working while nobody is online.

The core loop

Every garden game comes down to one loop that players repeat. Build this first, in grey blocks:

  1. Buy seeds
  2. Plant them on your plot
  3. Wait (or come back later)
  4. Harvest, sell, buy better seeds

Systems you need

Plots

Soil parts that belong to one player, each with a ProximityPrompt.

Seeds

A table of seed types with grow time, sell value and color.

Real-time growth

Store PlantedAt = os.time() and compare with the current time — not a countdown.

Harvest and sell

A grown plant gives a fruit; a sell stand turns fruit into coins.

Saving plots

Save each plot's seed and PlantedAt so the garden grows between sessions.

Build order

  1. 1

    One plot, one seed

    The script below on a single soil part.

  2. 2

    Seed shop

    A stand that sells seeds for coins; store seed counts as attributes or values.

  3. 3

    A plot per player

    Claim a garden on join; only the owner's prompts work there.

  4. 4

    Saving

    Save plots with a data store, and restore plants on join.

  5. 5

    Rare variants

    Small chances of golden or giant fruit that sell for much more — the genre's long-term chase.

The key script: Plant, grow in real time and harvest

Where it goes: Workspace > Garden > Plot (Part) > PlotScript (Script).

  • The plot is an anchored Part (the soil) with a ProximityPrompt inside and this Script.
  • Players have leaderstats > Coins (IntValue).
Workspace > Garden > Plot (Part) > PlotScript (Script)
local Players = game:GetService("Players")

local plot = script.Parent
local prompt = plot:WaitForChild("ProximityPrompt")

local SEED = { name = "Carrot", growSeconds = 60, value = 15, color = Color3.fromRGB(255, 140, 40) }
local plant -- the growing part

local function progress()
	local plantedAt = plot:GetAttribute("PlantedAt")
	if not plantedAt then return nil end
	return math.clamp((os.time() - plantedAt) / SEED.growSeconds, 0, 1)
end

local function updatePlant()
	local p = progress()
	if not p then
		prompt.ActionText = "Plant " .. SEED.name
		return
	end
	if not plant then
		plant = Instance.new("Part")
		plant.Anchored = true
		plant.CanCollide = false
		plant.Material = Enum.Material.SmoothPlastic
		plant.Parent = plot
	end
	local height = 0.5 + p * 3
	plant.Size = Vector3.new(1 + p, height, 1 + p)
	plant.CFrame = plot.CFrame * CFrame.new(0, plot.Size.Y / 2 + height / 2, 0)
	plant.Color = p < 1 and Color3.fromRGB(90, 170, 70) or SEED.color
	prompt.ActionText = p < 1 and ("Growing " .. math.floor(p * 100) .. "%") or "Harvest"
end

prompt.Triggered:Connect(function(player)
	local p = progress()
	if not p then
		plot:SetAttribute("PlantedAt", os.time()) -- growth is based on time, not a timer
	elseif p >= 1 then
		player.leaderstats.Coins.Value += SEED.value
		plot:SetAttribute("PlantedAt", nil)
		plant:Destroy()
		plant = nil
	end
	updatePlant()
end)

while true do
	updatePlant()
	task.wait(1)
end

How it works

  • Because growth is os.time() - PlantedAt, a plant saved with its PlantedAt keeps growing while the player is offline — restore the attribute on join and it's already further along.
  • To limit a plot to its owner, give it an OwnerId attribute and return early in Triggered for anyone else.
  • For many plots, move this logic into one script in ServerScriptService that loops over plots tagged Plot.

How garden games make Robux

  • Grow-speed boosts and extra plot space.
  • Rare seed packs as developer products, with odds shown.
  • Cosmetic garden decorations.

You receive 70% of what players spend on game passes and developer products; Roblox keeps 30%.

Common mistakes

Countdown timers

A task.wait(60) timer stops when the server shuts down. Timestamps survive servers and sessions.

Copying a hit game's look

Use your own plants, art and name. The genre is fine; copied assets and branding are not.

Nothing to do while waiting

Give players short tasks between harvests — decorating, trading, small quests — or they leave and don't come back.

FAQ

How do plants grow while players are offline in Roblox?

Store the time a seed was planted (os.time()) and save it. When the player returns, compare it with the current time to know how grown the plant is.

Can I make a game like Grow a Garden?

You can make a game in the same genre. Don't copy its name, art, characters or assets — make your own theme and plants.

Is a garden game good for beginners?

Yes. The core is one growth script and a shop, and it doesn't need combat or complex physics.

Keep reading