Skip to content
Type to search…

Create a New Tab

A Tab is analogous to a ticket. Typically a Tab is opened and then one or more orders of Items are added to it. The tab is eventually closed by zeroing out the balance due.

A Tab is analogous to a ticket. Typically a Tab is opened and then one or more orders of Items are added to it.

The tab is eventually closed by zeroing out the balance due, either by providing one or more payments, or by refunding/voiding items.

The four essential parts of a Tab include:

The Tab’s spot represents a physical location, such as a seat at a table in a restaurant or a delivery address, that the order will be sent to. If the spot allows scheduling, which is typical of takeout and delivery orders, then the order can be scheduled for delivery to that spot at a future date. Otherwise the delivery time will be set to ASAP.

The spot also can affect what items can be ordered. For example, a spot at the bar may serve alcoholic beverages whereas a spot on the patio does not. In most cases the spot should be determined before items are selected.

The guest is represented by a unique identifier such as their phoneNumber or a customerId.

It is recommended that the guest identifier be provided as the guest, through their inclusion in certain segments, may affect the final price of the order. e.g. by having a first time buyer, employee, or military discount.

An item is either a Catalog Item or an Open Item.

  • A Catalog Item is resolved from a product that already exists in the GoTab product catalog, identified by its productUuid (or other product identifiers). Pricing, tax, and other attributes are inherited from the catalog.
  • An Open Item is an ad-hoc item not tied to the catalog. It requires a name and a unitPrice since there is no catalog entry to resolve those values from.

Both item types support modifiers, itemUnits, and quantity.

⚠️ Quantity rule: To order multiple units of the same product, set quantity on a single item object. Do not add separate objects with the same productId — duplicate entries cause an error.

Wrong — two objects for the same product:

"items": [
{ "productUuid": "prd_abc", "quantity": 1 },
{ "productUuid": "prd_abc", "quantity": 1 }
]

Right — one object with quantity: 2:

"items": [
{ "productUuid": "prd_abc", "quantity": 2 }
]
FieldTypeRequiredNotes
productobjectSee product fields below
quantitynumberThe quantity to order
modifiersarrayA list of modifier groups and their selected options
itemUnitsstringUnit label shown on receipt, e.g. "oz", "lbs", "pints"
namestringCustom display name (3–20 chars), visible on receipt and KDS
unitPriceintegerOverride unit price in cents (min: 1, max: 100000)

Product fields (at least one identifier is expected):

FieldTypeNotes
productUuidstringUnique UUID of the product — most common identifier
productIdstringUnique ID of the product
productNamestringName of the product
categoryUuidstringUUID of the category the product belongs to
categoryIdstringID of the category the product belongs to
categoryNamestringName of the category the product belongs to
{
"product": {
"productUuid": "prd_utucyIkdVyqOwgK4o2KKY819"
},
"quantity": 2,
"itemUnits": "pints",
"modifiers": []
}

Open items are useful when you need to charge for something that isn’t in the catalog — such as a custom service charge, a special event item, or a one-off product.

FieldTypeRequiredNotes
namestringDisplay name (3–20 chars), visible on receipt and KDS
quantitynumberMinimum: 1
unitPriceintegerPrice in cents (min: 1, max: 100000)
modifiersarrayA list of modifier groups and their selected options
externalIdstringYour external reference for this item
itemUnitsstringUnit label shown on receipt, e.g. "oz", "lbs", "bottles"
taxRatenumberDecimal tax rate (min: 0, max: 1). e.g. 0.085 for 8.5%
{
"name": "Custom Catering Fee",
"quantity": 1,
"unitPrice": 5000,
"taxRate": 0.085,
"externalId": "catering-fee-001"
}

The notes field accepts a JSON object and is available on both open items and catalog items. Use it to attach integration-specific metadata that your system needs to associate with the item — for example, an external order ID or a loyalty reference. The field is returned as-is on the item node in GraphQL queries.

{
"name": "Loyalty Redemption Item",
"quantity": 1,
"unitPrice": 0,
"notes": { "your_integration_key": { "external_id": "order_abc123" } }
}

Both catalog and open items support modifiers. A modifier represents a guest’s selection within an option group — for example, choosing a size, a temperature, or a set of toppings.

FieldTypeNotes
optionGroupHashstringThe hash identifying the option group
optionsarrayOne or more options selected from the group
options[].optionHashstringThe hash identifying the specific option
options[].quantitynumberQuantity of that option selected
"modifiers": [
{
"optionGroupHash": "{optionGroupHash}",
"options": [
{
"optionHash": "{optionHash}",
"quantity": 1
}
]
}
]

💡 A single item can have multiple modifier groups. Each group can also have multiple options selected — for example, a “Toppings” group where the guest picks several items at once. See Example 3 for a full illustration.


First ensure that a spot and time are selected. From there, customers will select products from one or more menus.

Menu and products are dynamic in GoTab based on various reasons (e.g. rules and segments) for a location. If your application is displaying menus/products/items, prior to creating a new tab your application should be querying their availability. This best practice will ensure a guest is not viewing a menu or product that is not available for order and prevent errors at checkout.

  • Rules and segments that can impact an order are guest segments (e.g. VIP, first time buyer, beer club member, etc.).
  • Products or items may be disabled or 86’d throughout the day, and some restaurants may disable their online or takeout ordering temporarily for various reasons.

Send a POST request to /api/loc/:location_uuid/tabs to create a tab at the location.

📘 Use Price Check

You do not need to include any discount or fee items, but you do need to ensure that the payment sufficiently covers the balance. Use the price check route when creating and closing a tab all at once.

A customer must be associated with a tab — therefore a customerId or a phoneNumber is required when creating the tab.

ParameterDeveloper Notes
"phoneNumber": "+19999999999"Required if customerId not supplied
"customerId": ""Required if phoneNumber not supplied

⚠️ Do not include fees and discounts if you retrieved them from the price check route.

📘 Open Tabs

Currently, the API only supports CLOSED tabs. openTab must be set to false.

  • When openTab: false — the tab is created and closed immediately. There must be at least one item and the payments must bring the balance due to 0, or an error will be thrown. A spotUuid is also required, as it fires the order to the correct KDS.
  • When openTab: true — the tab is created as an open tab and items can be added to it later via Add Items to Tab.
"payments": [
{
"tipAmount": 0, // calculated in cents
"payAmount": 100, // calculated in cents
"externalId": "12345", // (Optional) external payment reference from your system
"methods": [
{
"processor": "DOORDASH",
"amount": 100 // amount on all methods should match tipAmount + payAmount
}
]
}
]

Depending on how your application is taking orders, you may need to display a pick-up time or delivery time to the customer. Make sure you are allowing orders to be placed within the available schedules. By default, scheduled is set to ASAP. Additional notes are optional but it is also important to query specific menu requirements set up by the operator — for example, with takeout/pickup orders the customer may be required to provide the make and/or model of their car.

"scheduled": "2022-01-31",
"spotUuid": "string", // Required when openTab is false
"notes": "Make it quick!" // (Optional) Notes on the order

The following examples cover the most common integration scenarios. Each demonstrates a different use case to help you understand which approach fits your needs.


Example 1: Simple Closed Tab (Single Item)

Section titled “Example 1: Simple Closed Tab (Single Item)”

Scenario: A third-party delivery platform (e.g. DoorDash) submits a completed order with a single item and payment all in one request. This is the most common pattern for delivery integrations where the order is paid externally and just needs to be fired to the kitchen immediately.

{
"externalId": "GoTab Test 1",
"openTab": false,
"spotUuid": "spt_Rem6_xbjGabsHhAWWdTBdIiL",
"phoneNumber": "1233455678",
"items": [
{
"externalId": "9876",
"quantity": 4,
"productUuid": "prd_utucyIkdVyqOwgK4o2KKY819",
"modifiers": []
}
],
"payments": [
{
"payAmount": 6180,
"tipAmount": 800,
"externalId": "3PD transactionId",
"methods": [
{
"amount": 6980,
"processor": "DOORDASH"
}
]
}
]
}

💡 payAmount + tipAmount must equal the amount on each payment method. In this example: 6180 + 800 = 6980.


Example 2: Open Tab with a Single Item and Modifier

Section titled “Example 2: Open Tab with a Single Item and Modifier”

Scenario: A tableside or kiosk ordering flow where the guest is still seated and may continue ordering. The tab is opened immediately with one item and a modifier selection (e.g. choosing a size or add-on). Additional items can be added later via the Add Items to Tab endpoint.

Terminal window
curl -X POST https://api.gotab.io/loc/{location}/tabs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"openTab": true,
"spotUuid": "{spotUuid}",
"items": [
{
"quantity": 1,
"productUuid": "{productUuid}",
"modifiers": [
{
"optionGroupHash": "{optionGroupHash}",
"options": [
{
"optionHash": "{optionHash}",
"quantity": 1
}
]
}
]
}
]
}'

Example 3: Open Tab with Multiple Items and Multiple Modifier Groups

Section titled “Example 3: Open Tab with Multiple Items and Multiple Modifier Groups”

Scenario: A more complex dine-in order where multiple items are added at once, and some items have multiple modifier groups (e.g. a burger with both a “doneness” group and a “toppings” group). This demonstrates that a single item can belong to multiple modifier groups, and each group can have multiple options selected simultaneously.

Terminal window
curl -X POST https://api.gotab.io/loc/{location}/tabs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"openTab": true,
"spotUuid": "{spotUuid}",
"name": "Table 4",
"items": [
{
"quantity": 1,
"productUuid": "{productUuid_1}",
"modifiers": [
{
"optionGroupHash": "{optionGroupHash_1}",
"options": [
{
"optionHash": "{optionHash_1}",
"quantity": 1
}
]
}
]
},
{
"quantity": 2,
"productUuid": "{productUuid_2}",
"modifiers": [
{
"optionGroupHash": "{optionGroupHash_2}",
"options": [
{ "optionHash": "{optionHash_2}", "quantity": 1 }
]
},
{
"optionGroupHash": "{optionGroupHash_3}",
"options": [
{ "optionHash": "{optionHash_3}", "quantity": 1 },
{ "optionHash": "{optionHash_4}", "quantity": 1 }
]
}
]
}
]
}'

💡 The optional name field (e.g. "Table 4") can be used to label the tab for staff visibility in the GoTab dashboard.


Scenario: A pre-order or catering workflow where the guest is ordering in advance for a future date — such as a next-day pickup or an event. The fiscalDate must be between 1 and 90 days in the future. Scheduled tabs must be open tabs.

Terminal window
curl -X POST https://api.gotab.io/loc/{location}/tabs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"openTab": true,
"spotUuid": "{spotUuid}",
"fiscalDate": "2026-05-01T00:00:00Z",
"items": []
}'

💡 Items can be empty at creation and added later once the operator confirms availability for that date. Use the Add Items to Tab endpoint to add items to the scheduled tab.


Example 5: Open Tab with Adjustments (Discounts / Surcharges)

Section titled “Example 5: Open Tab with Adjustments (Discounts / Surcharges)”

Scenario: Applying a tab-level adjustment at order creation — such as a family discount, a catering surcharge, or a promotional credit. The value is in cents; use a negative value for discounts and a positive value for surcharges.

Terminal window
curl -X POST https://api.gotab.io/loc/{location}/tabs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"openTab": true,
"spotUuid": "{spotUuid}",
"tabAdjustments": [
{
"value": -500,
"name": "Family Discount"
}
],
"items": [
{
"quantity": 1,
"productUuid": "{productUuid}",
"modifiers": []
}
]
}'

💡 tabAdjustments are applied at the tab level, not per item. For item-level discounts, those should be handled via product pricing rules or segments configured in GoTab.