Skip to the article
Aniq-UI

Food StudioThe ordering website

The ordering website

What the website does for customers: its pages, the menu and the meal builder, cart and checkout, kitchens and delivery areas, order tracking, accounts and rewards, analytics tags and search engines.

For the Full Stack package

Pages

Every page exists in English under /en and in Arabic under /ar. A path without a language goes to /en.

PathWhat it shows
/enThe home page: nine sections built in the dashboard's homepage editor, from the hero and the categories to popular dishes, the combo, the meal builder, delivery, rewards and the questions.
/en/shopThe menu, with search, category, dietary and sort controls that live in the address, so every view can be shared. A dish that cannot be ordered right now stays visible and says so.
/en/categoriesThe menu's categories.
/en/products/<slug>A dish: gallery, size and extras with the price on the button, an instructions field, quantity from 1 to 10, ingredients, allergens, reviews and related dishes. The combo has its own page at the same address, with its choices and their surcharges.
/en/cartThe cart, with a promo code, delivery or pickup, the delivery address, an upsell row and a total the API prices.
/en/checkoutContact, delivery and payment on one page beside the order summary. Open to guests.
/en/order-confirmation/<number>The order that was just placed, following it from the kitchen to the door.
/en/track-orderOrder tracking by order number and email, with no account.
/en/locationsThe kitchens: a postcode check for delivery or pickup, open state and hours, delivery areas and a map.
/en/about, /en/contact, /en/faq, /en/privacy, /en/termsSupport and legal pages. A message from the contact form arrives in the dashboard's notifications, for the owner and the managers.
/en/auth/login, /en/auth/register, /en/auth/forgot-password, /en/auth/reset-passwordSign-in, registration and password reset for customers.
/en/accountThe signed-in area: an overview with the reward points, orders and their detail with reorder, saved addresses, the profile, order tracking and saved dishes.
  • The demo menu has 64 dishes in eight categories, each with English and Arabic texts, pictures, options, allergens and dietary tags. Staff edit all of it in the dashboard.
  • A dish's options are groups of choices, such as a size or extras, each with its own price change. The price on the button follows the choices.
  • The combo is a main, a side and a drink for one price, $19.99 in the demo, with a surcharge for some swaps. The meal builder on the home page picks the three and opens the combo with that choice.
  • A dish staff mark unavailable, or one whose tracked stock runs out, stays on the menu and cannot be added.

Kitchens, delivery and pickup

  • Every order is cooked by one kitchen. The demo has four: Central, Riverside, Uptown and Harbor, each with its own hours, timezone, preparation time and delivery postcodes.
  • Delivery goes only to the postcodes a kitchen lists; pickup is at the kitchen's own address. The customer enters a postcode, and the website picks a kitchen that serves it and is open, or offers the alternatives.
  • A kitchen takes orders only while it is open. The seed starts the restaurant on a demo clock that holds every kitchen at 20:55, so the demo can order at any hour; staff switch it to the real clock in Settings, Restaurant.
  • The estimated time is the kitchen's preparation time plus 5 to 15 minutes for delivery, and plus 0 to 10 for pickup.
  • The map on the locations page is drawn in code from each kitchen's map point, and needs no map service.

Cart and checkout

  • A guest's cart lives in the browser. A signed-in customer's cart is kept on the server, and a guest cart is merged into it on sign-in.
  • Every total, in the cart and at checkout, is priced by the API from its own menu and settings, so what the customer sees is what is charged. If a price moved or a dish became unavailable since the cart was filled, checkout shows the change and asks the customer to accept it.
  • Fees in the demo: delivery $2.99, pickup free, and a $10.00 delivery minimum. Staff change them in Settings, Restaurant.
  • The promo code TASTE10 takes 10% off the menu items. Codes do not combine with redeemed points unless staff allow it for that code.
  • A guest checks out with a name, an email and a phone number; a signed-in customer's details and default address fill the form.
  • Payment happens on Stripe's or PayPal's own page, or with the demo payment when no provider is set. After paying, the customer comes back to the order page.

Order tracking

An order moves through pending, confirmed, preparing and ready, then out for delivery and delivered, or straight to delivered when it is picked up. A guest tracks it at /en/track-order with the order number and the email it was placed with; a customer sees it in the account. The timeline updates by itself while the kitchen works. An unknown number and a wrong email get the same answer, so tracking cannot be used to find other people's orders.

Customer accounts and rewards

  • Customers register with a name, an email and a password of at least 8 characters. They sign in on the website only: a customer account cannot open the dashboard.
  • Rewards. A paid order earns one point for every dollar of food after discounts, once it is delivered. 100 points take $5.00 off an order at checkout. The account shows the balance and the history. Staff change both numbers in Settings, Restaurant.
  • Saved dishes follow the customer from device to device, and a past order can be ordered again in one click.
  • Password reset emails a link to the website's reset page when the API has a mail provider set. The link works once, within an hour.
  • Reviews. A dish's page shows its reviews, the average, the number of reviews and the breakdown by stars. The website has no form to write one: the API takes a signed-in customer's review at POST /api/reviews, and the demo's reviews come from the seed.

Analytics and tracking pixels

Six networks are wired up. Turn one on by putting its id in the website's .env and rebuilding:

VariableNetwork
NEXT_PUBLIC_GTM_IDGoogle Tag Manager
NEXT_PUBLIC_GA4_MEASUREMENT_IDGoogle Analytics 4
NEXT_PUBLIC_META_PIXEL_IDFacebook and Instagram
NEXT_PUBLIC_TIKTOK_PIXEL_IDTikTok
NEXT_PUBLIC_SNAPCHAT_PIXEL_IDSnapchat
NEXT_PUBLIC_PINTEREST_TAG_IDPinterest
  • An id left blank loads no script at all. If you set only one, set NEXT_PUBLIC_GTM_ID: Tag Manager can load the others. If GA4 runs inside Tag Manager, leave the GA4 id blank or every session is counted twice.
  • The website reports page_view, view_item, add_to_cart, remove_from_cart, add_to_wishlist, view_cart, begin_checkout, purchase, search, sign_up and login, with the dishes, the value and the currency (NEXT_PUBLIC_ANALYTICS_CURRENCY, USD by default).
  • The tags load as soon as the page does. If you sell into the EU or the UK, put a consent banner in front of them first.

Search engines

Every page sets its own title, description and canonical address, with the other language as an alternate. Carts, checkout, accounts, tracking and sign-in pages are marked noindex. /sitemap.xml lists every public page in both languages and every published dish, and /robots.txt points to it. Set domain.url in src/config/brand.config.ts to your real address so both use it.

The public demo build

Included with your purchase. Sign in to read, or open it in your download.

How the website behaves on a public demo build, and how to remove that code.

How the website's code fits together

Included with your purchase. Sign in to read, or open it in your download.

The code's structure and the conventions to keep when you change it.

Stuck on a step?

Find a fix before you start over.

Troubleshooting

Cookie Preferences

We use cookies to enhance your browsing experience, analyze site traffic, and personalize content. By clicking "Accept All", you consent to our use of cookies for analytics and personalized advertising.