Prood
ApplicationsDashboard

Products

Product management in the dashboard — create, edit, variants, images, and inventory.

The dashboard provides full product lifecycle management through the Commerce API admin endpoints.

Product list

Route: /products

Displays a paginated table of products for the active organization:

ColumnSource
Nameproduct.name (localized)
Statusdraft, published, archived
PriceBase variant price (formatted)
InventoryTotal stock across variants
Createdproduct.createdAt

Actions: edit, delete (with confirmation).

Create product

Route: /products/new

Server action in app/(dashboard)/products/actions.ts:

'use server'
export async function createProduct(input: CreateProductInput) {
  const api = getCommerceApi()
  return api.POST('/admin/products', { body: input })
}

Product fields

FieldTypeRequiredDescription
nameLocalized stringYesProduct name (per locale)
slugstringYesURL-safe identifier
descriptionLocalized stringNoRich text description
statusenumYesdraft or published
categoriesstring[]NoCategory IDs
variantsVariantInput[]YesAt least one variant
optionsOptionInput[]NoConfigurable options (size, color)
imagesImageInput[]NoProduct images (via storage provider)

Variants

Each product requires at least one variant:

FieldDescription
skuStock keeping unit
pricePrice in minor units (cents)
compareAtPriceOriginal price for sale display
inventoryStock quantity
optionsSelected option values for this variant

Edit product

Route: /products/[id]/edit

Loads existing product from API and renders an edit form. Updates via:

await api.PATCH('/admin/products/{id}', { body: updateInput })

Inventory can be adjusted independently:

await api.PATCH('/admin/inventory/{variantId}', { body: { quantity } })

Image uploads

Product images are uploaded via the storage provider configured in the environment:

ProviderUpload path
Vercel BlobuploadForTenant(orgId, file) → CDN URL
S3 / R2uploadForTenant(orgId, file) → public URL

Images are namespaced per tenant: org/{orgId}/products/{productId}/...

API endpoints used

ActionMethodEndpoint
List productsGET/v1/admin/products
Get productGET/v1/admin/products/{id}
Create productPOST/v1/admin/products
Update productPATCH/v1/admin/products/{id}
Delete productDELETE/v1/admin/products/{id}
Update inventoryPATCH/v1/admin/inventory/{variantId}

All endpoints require admin scope (session with active organization).

On this page