Home Integrations and developers

Integrations and developers

Connect your POS, pixels, delivery apps and your own systems.
By Hamad
• 11 articles

Find, connect and disconnect integrations

For: Owners, Operations Where: Setup > Integrations Available: Web dashboard · All countries Your store works with other tools: ad platforms, your POS, courier companies and your own systems. The Integrations page lists all of them in one place, so you can connect a tool and see at a glance which ones work. How it works Each tool is one row. The row shows its name, a badge and one line about it. When a tool is connected, the line shows what you saved, such as the Pixel ID. The rows are in sections, in this order: Customer Acquisition, Point of Sale, Customer Lifecycle, Measurement, Mobile App, Workflow & Custom, Location Services and Delivery. Each section heading shows how many of its tools are connected, or how many tools it holds when none is. The Integrations page, with Meta connected Find a tool 1. Go to Setup > Integrations. 2. Type in Search integrations. You can search in English or Arabic. 3. To narrow the list, choose All, Recommended or Connected beside the search box. Recommended shows the tools to start with: Meta, Snapchat and TikTok, and the Order Food button if your store has it. Connect a tool 1. Select the tool's row. The end of the row says Connect. 2. Fill in the sheet that opens. Each tool asks for its own keys or IDs. 3. Select Connect. The row then shows Connected. To change what you saved, select the row again. It now says Edit. What the badges mean | Badge | Meaning | |---|---| | Connected | The tool is set up and working. | | Default | The courier company Zyda uses first for delivery fees and times. | | Action required | The tool stopped working. The line under the name says why. | | Paused | The tool is set up but turned off. | | Available on request | Zyda must turn this tool on for your store first. Ask your Zyda account manager. | | Beta | A POS or courier company that is still in testing. You can connect it. | | New, Enhanced | The tool is new on this page, or it gained new features. | Fix a tool that shows Action required The line under the name says what to do. For example: "The access token was rejected. Generate a new one and save it to resume tracking." 1. Select the row. 2. Enter the new value, such as a new access token. 3. Select Save changes. Disconnect a tool 1. Select More (the three dots) at the end of the row. 2. Select Disconnect. 3. Confirm. Events stop reaching the tool right away. Disconnecting an ad platform removes both its Pixel and its server token. Rules and limits - Integrations shows in the sidebar for the Owner and Operations roles, and for roles you copied from them. - Webhooks and API keys open their own pages. You manage them there, not from the row menu. - POS and courier rows have their own steps. See Connect your POS, such as Foodics and Connect a courier company. Common questions Why can't I see Integrations in the sidebar? Your role does not include integrations. Ask the store owner to change your role. Why is a tool greyed out with Available on request? Zyda turns these tools on per store. Ask your Zyda account manager to turn them on. Related articles - Connect the Meta Pixel and Conversions API - Connect your POS, such as Foodics - Set up webhooks and API keys - See what each role can open and do

Last updated on Oct 20, 2026

Connect the Meta Pixel and Conversions API

For: Owners, Operations Where: Setup > Integrations > Meta (Facebook & Instagram) Available: Web dashboard · All countries Your Meta ads work better when Meta knows who visited your store and who ordered. Connect your Meta Pixel and the Conversions API, and Zyda sends these events to Meta for you. How it works You give Zyda two things: - The Pixel ID. Your store loads the Meta Pixel in the customer's browser. - The Conversions API access token. Zyda's server sends the same events to Meta. This keeps events that the browser loses, for example to ad blockers. Both use the same event ID, so Meta counts each event once. For the list of events, see What your pixels and conversion APIs receive. The Meta sheet with the Pixel ID and the Conversions API token Connect Meta 1. In Meta Events Manager, open Data sources, then your dataset, then Settings. Copy the Dataset ID. It has 15 or 16 digits. 2. On the same page, under Conversions API, select Generate access token. Copy it. Meta shows it once. 3. In Zyda, go to Setup > Integrations and select Meta (Facebook & Instagram). 4. Paste the number in Pixel ID. 5. Paste the token in Conversions API access token (secret). 6. Select Connect. The token field stays off until you enter a Pixel ID. A token without a Pixel would count events twice. Test your events 1. In Meta Events Manager, open Test Events and copy the test code. 2. In the Meta sheet, paste it in Test event code. 3. Copy the Test link and open it. 4. Browse your store and place a test order. Your events show in Meta's Test Events tab. Only the browser that opened the link is affected. Your customers' events are not changed. Change or remove the token - Zyda never shows a saved token again. Leave the field blank to keep it. - To use a new token, paste it and select Save changes. - To stop server events but keep the Pixel, select Remove the saved token. When the tile says Action required Meta refused the token or the Pixel ID. The row shows the reason: | Message | What to do | |---|---| | The access token was rejected. Generate a new one and save it to resume tracking. | Make a new token in Meta Events Manager and save it. | | The Pixel ID was rejected. Check it and save it again to resume tracking. | Copy the Dataset ID again and save it. | If Meta keeps refusing the token for an hour or more, Zyda removes the saved token. Server events then stop until you save a new one. Add your menu as a Meta catalog A Meta catalog lets you run ads that show your dishes, with photos, prices and a link to order. Zyda gives you a feed of your menu that stays up to date. 1. On the Meta row, select More (the three dots), then Product catalog. 2. Copy the Catalog data source link. 3. In Meta Commerce Manager, open your catalog. Go to Catalog, Data sources, Add items, then Data feed. 4. Choose Use URL and paste the link. 5. Set the schedule to daily, and save. For Arabic names, add the second link in the same catalog as a Language feed. A catalog cannot use the Arabic link alone. The catalog works with or without the Pixel. If your store is not published yet, the sheet says "Your store link is not ready yet. Publish the store, then come back." Order Food on Instagram and Facebook Meta no longer lets new stores connect the Order Food button. If your store connected it before, it still shows on the page as connected. Its row has no Edit and no Disconnect. If the button is removed, it cannot be connected again. If Order Food created a Pixel for you, the Meta sheet says so. Zyda uses your own Pixel when you enter one. If you do not, Zyda uses the Order Food Pixel. Rules and limits - Zyda sends no events for orders your staff take in the dashboard. Phone orders have no ad click behind them. - Disconnecting Meta removes the Pixel ID and the token together. Common questions Why do I see fewer purchases in Meta than in Zyda? Orders your staff take in the dashboard, and orders your own system sends with the orders API, are not sent. Also, the purchase value leaves out delivery, service fee and tax. Do I need both the Pixel and the token? The Pixel alone works. The token adds server events, so Meta loses fewer of them. Related articles - What your pixels and conversion APIs receive - Connect Snapchat and TikTok tracking - Find, connect and disconnect integrations

Last updated on Oct 20, 2026

Connect Snapchat and TikTok tracking

For: Owners, Operations Where: Setup > Integrations > Snapchat or TikTok Available: Web dashboard · All countries If you advertise on Snapchat or TikTok, the platform needs to see your visits and orders to show your ads to the right people. Add your Pixel and server token, and Zyda sends the events from the browser and from its server. How it works Snapchat and TikTok work the same way as Meta: - The Pixel runs in your customer's browser. - The server token lets Zyda's server send the same events. The platform counts each event once. For the list of events, see What your pixels and conversion APIs receive. The TikTok sheet with the Pixel Code and the Events API token What each platform asks for | Platform | First field | Second field (secret) | Test link adds | |---|---|---|---| | Snapchat | Pixel ID, shaped like 1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f | Conversions API access token | snap_test_event_code | | TikTok | Pixel Code, 20 capital letters and digits | Events API access token | tiktok_test_event_code | Copy both values from the platform's Events Manager. Connect Snapchat or TikTok 1. Go to Setup > Integrations. 2. Select Snapchat or TikTok. 3. Paste the Pixel ID or Pixel Code. 4. Paste the access token. 5. Select Connect. The token field stays off until you enter the Pixel. A token without its Pixel would count events twice. If you paste a value in the wrong shape, the sheet says so before you save, for example "This does not look like a valid Events API token." Test your events 1. In the platform's Events Manager, open Test Events and copy the test code. 2. Paste it in Test event code. 3. Copy the Test link, open it, and place a test order. Only the browser that opened the link is affected. When the tile says Action required The platform refused your token or your Pixel. Zyda stops sending server events, and the row says why. Make a new token, or check the Pixel, and select Save changes. Rules and limits - Zyda sends server events only when both the Pixel and the token are saved. - Zyda never shows a saved token again. Leave the field blank to keep it. Select Remove the saved token to stop server events. - Disconnecting removes the Pixel and the token together. Common questions I pasted the whole link that Snap gave me. Is that right? No. Paste only the token. A pasted link is refused by Snap, and the tile then shows Action required. Are phone orders sent to Snapchat or TikTok? No. Orders your staff take in the dashboard are never sent. Related articles - What your pixels and conversion APIs receive - Connect the Meta Pixel and Conversions API - Find, connect and disconnect integrations

Last updated on Oct 20, 2026

What your pixels and conversion APIs receive

For: Owners, Operations Where: Setup > Integrations > Meta, Snapchat or TikTok Available: Web dashboard · All countries Before you build an ad campaign, you need to know which events the platform gets and what they mean. This article lists what Zyda sends to Meta, Snapchat and TikTok once you connect them. How it works Zyda sends events in two ways: - From the browser. Your store loads the platform's Pixel. It sends events while the customer browses. - From Zyda's server. When you save a server token, Zyda's server sends the same shopping events again. This keeps events that ad blockers or closed tabs would lose. Both copies carry the same event ID. The platform keeps one and drops the other. The test link that sends your own visit to the platform's Test Events The events | When the customer… | Meta | Snapchat | TikTok | Also sent from the server? | |---|---|---|---|---| | Opens any page of your store | PageView | PAGE_VIEW | PageView | No | | Opens a product | ViewContent | VIEW_CONTENT | ViewContent | Yes | | Adds a new item to the cart from the product page | AddToCart | ADD_CART | AddToCart | Yes | | Starts checkout | InitiateCheckout | START_CHECKOUT | InitiateCheckout | Yes | | Places the order | Purchase | PURCHASE | Purchase | Yes | Snapchat and TikTok also send a page view each time the customer moves to another page of your store. Which orders send a purchase | Where the order came from | Purchase sent? | |---|---| | Your website | Yes, from the browser and from the server. | | Your own store app | Yes, from the server, to Meta, Snapchat and TikTok. | | A website order whose browser event was lost (for example, the customer closed the payment page) | Meta only: Zyda's server sends it 15 minutes later. | | An order your staff took in the dashboard | No. | | An order your own system sent with the orders API | No. | The purchase is sent once for each order, from the browser that placed it. What a purchase carries - Value: the price of the items after item discounts and the promo code. It does not include the delivery fee, the service fee or tax. So it is lower than the order total. - Currency: your store's currency. - Items: each product's ID, quantity and price. - Event ID: purchase_order_ and the order number. Meta, Snapchat and TikTok use it to remove the double. - Customer details, to match the order to a person: email, phone, name, city, country and a customer ID. Zyda turns them into codes (hashes) before it sends them from the server. Rules and limits - Server events need both the Pixel and the token. With the Pixel only, events come from the browser only. - Zyda does not load the Pixels while your staff take a phone order in the dashboard. - A test code you add with the Test link reaches the platform with server events. It stays in that browser for 7 days. Common questions Why is the purchase value lower than the order total? Delivery fee, service fee and tax are left out. The value is what the customer paid for the items. Why don't phone orders show as conversions? A phone order has no ad click behind it. Sending it would make your ads look better than they are. Related articles - Connect the Meta Pixel and Conversions API - Connect Snapchat and TikTok tracking - Connect Google Analytics 4 and Tag Manager

Last updated on Oct 20, 2026

Connect Google Analytics 4 and Tag Manager

For: Owners, Operations Where: Setup > Integrations > Google Analytics 4 or Google Tag Manager Available: Web dashboard · All countries Google Analytics 4 shows where your store's visitors come from and which of them order. You can let Zyda send this data for you, or load your own Google Tag Manager container and set up the tags yourself. How it works There are two ways to get data into Google Analytics 4 (GA4). Pick one, not both, or every visit and order is counted twice. | | GA4 through Zyda | Your own Tag Manager | |---|---|---| | What you enter | The Measurement ID, with First-party tracking on | The Container ID | | Who sets up the tags | Zyda | You, in Google Tag Manager | | Route | Through Zyda's own address, sgtm.zyda.com | Straight from the browser to Google | | Lost to ad blockers and Safari | Fewer visits and orders lost | More lost | The Google Analytics 4 sheet with First-party tracking on Send GA4 data through Zyda 1. In Google Analytics, go to Admin, Data Streams, then your web stream. Copy the Measurement ID. It starts with G-. 2. In Zyda, go to Setup > Integrations and select Google Analytics 4. 3. Paste it in Measurement ID. 4. Turn on First-party tracking. 5. If you also run GA4 in your own Tag Manager, delete or pause that GA4 tag first. Then tick "I do not run GA4 in my own GTM, or I removed it." 6. Select Connect. The Connect button stays off until you tick the box in step 5. Check that it works 1. Open your store and place a test order. 2. In Google Analytics, open Reports, then Realtime. The visit and the order show within a minute or two. What GA4 receives With First-party tracking on, your store sends these events to your GA4 property: page_view, view_item, add_to_cart, begin_checkout and purchase. The purchase carries the order number as its transaction ID. Load your own Google Tag Manager container 1. In Google Tag Manager, copy your Container ID. It looks like GTM-XXXXXXX. 2. In Zyda, select Google Tag Manager. 3. Paste it in Container ID. 4. Select Connect. Your store then loads your container. Your store also adds these events to the data layer, for your tags to use: page_view on every page, view_item, add_to_cart and purchase. Google Ads tags can also go inside your own container. Rules and limits - The Measurement ID must start with a capital G and a dash, such as G-AB12CD34EF. A small g is refused. - With First-party tracking off, Zyda does not load GA4 on your store. The Measurement ID alone sends nothing. Turn it on, or load GA4 in your own container. - Your container and GA4 do not load while your staff take a phone order in the dashboard. - To remove GA4 or your container, select More, then Disconnect. Removing the Measurement ID also turns off first-party tracking. Common questions I added my Measurement ID but GA4 shows nothing. Why? First-party tracking is off. Turn it on, or set up GA4 inside your own Tag Manager container. Can I use both? Yes, if GA4 itself is set up in only one of them. Your container can hold other tags, such as Google Ads. Related articles - What your pixels and conversion APIs receive - Connect email, automation and other tools - Find, connect and disconnect integrations

Last updated on Oct 20, 2026

Connect your POS, such as Foodics

For: Owners, Operations Where: Setup > Integrations > Point of Sale Available: Web dashboard · All countries If your kitchen runs on a POS such as Foodics, online orders should reach it without anyone typing them in again. Connect your POS once, and Zyda sends your orders to it. How it works The Point of Sale section lists the POS systems Zyda works with. A system that is still in testing shows a Beta badge. When your POS is connected: - New orders go to your POS. - If your POS can send its menu, you can import it into Zyda. - Some changes are made in the POS, not in Zyda. For example, an order that reached the POS is edited in the POS. A connected POS and its menu Before you start Some POS systems cannot work with every store setting. If one of these is on, the connect sheet says so and links to the page that turns it off: | The sheet says | Where to change it | |---|---| | You have to disable the Card on Delivery… | Go to payment methods | | You have to disable the Auto Accept… | Go to order management | | You have to set taxes to 0… | Go to business information page | Connect your POS 1. Go to Setup > Integrations. 2. Under Point of Sale, select your POS. The row says Connect. 3. Read the notes in the sheet. 4. If the sheet asks for keys, enter them: - the API Key from your POS, or - a key for each branch. Each key is checked when you leave its field. 5. Select Connect now. Some POS systems ask for no key. Connect now then takes you to the POS, where you sign in and allow Zyda. You see "Authorized successfully", or, after signing in at the POS, a page that says Connected. If the POS can send its menu, the page says "Your account is connected. Import your menu next." Select Open Menu to import from your POS. If the page says Couldn't connect, select Back to integrations and try again. Import your menu from the POS The import happens in Setup > Menu. See Import or export your menu. Choose what happens when your POS cancels a paid order When your POS cancels or voids an order the customer paid online by card, Zyda refunds the card. This is on by default. 1. On your POS row, select More (the three dots). 2. Select Refund settings. 3. Turn Refund the card when the POS cancels off if you refund these orders yourself. It saves at once. The refund switch for a connected POS Disconnect your POS 1. Select More on the POS row. 2. Select Disconnect and confirm. The page reloads. New orders stop going to the POS. Rules and limits - Only people who can edit integrations see Refund settings. - If Zyda manages the connection key for you, there is no Disconnect. Ask Zyda support. - Some POS systems can only be connected by Zyda support. Their sheet says "Ask your Zyda account manager to turn these on." - Each branch's POS link shows on the branch page, under Integrations. See Add a branch and set its opening hours. Common questions Why can't I edit an order that is in my POS? The POS holds the order. Edit it in your POS. See Edit an order after it is placed. Does Zyda refund the customer when I cancel in the POS? Yes, for orders paid online by card, unless you turned off Refund the card when the POS cancels. Related articles - Import or export your menu - Add a branch and set its opening hours - Edit an order after it is placed - Find, connect and disconnect integrations

Last updated on Oct 20, 2026

Connect a courier company

For: Owners, Operations Where: Setup > Integrations > Delivery Available: Web dashboard · All countries If you have your own contract with a courier company, connect it to Zyda. Then you can send orders to it from the order, or let Zyda send them for you. How it works The Delivery section lists the courier companies that work in your country. Each one asks for the keys from your account with that company. Once connected, the company shows in the order's courier choices. Your Default courier is the one Zyda uses to work out delivery fees and times. This is different from the Zyda delivery network, where Zyda finds the courier for you. See Use the delivery network. A connected courier company and its menu Connect a courier company 1. Go to Setup > Integrations. 2. Under Delivery, select the company. The row says Connect. 3. Enter what the sheet asks for. It is one of these: - one API Key for your account; - a key for each branch; - your merchant API key, then the company's branch ID for each of your branches, in two steps. 4. If the sheet shows Deliver Within, choose Same Day or Next Day. 5. Select Connect now. In the two-step form, select Next, then Finish. Some companies ask for no key. Connect now then takes you to the company to sign in. Make it your default courier 1. On the company's row, select More (the three dots). 2. Select Make default. 3. Confirm. Orders' delivery fees and times are then worked out from this company. The row then shows Default. Let Zyda assign orders to it 1. Select More on the row, then Auto-assign settings. 2. Turn it on. 3. Under Select branches, choose All, or the branches that should use it. 4. Select Save. When you turn it on for a company, that company also becomes your Default courier. Only one company can assign orders automatically at a time. Automatic assignment on the delivery network turns off. Disconnect a courier company 1. Select More on the row. 2. Select Disconnect and confirm. Rules and limits - Auto-assign settings shows only for companies you connected yourself, not for network couriers. - If Zyda manages the company's key for your store, there is no Disconnect. - Turning on automatic assignment on the delivery network turns off automatic assignment to the companies you connected. Common questions Where do I send an order to my courier? From the order. See Assign a driver or courier to an order. Why is a courier company I use not in the list? It is not available in your country yet, or Zyda must turn it on for your store. Ask Zyda support. Related articles - Assign a driver or courier to an order - Use the delivery network - Assign your own drivers automatically - Find, connect and disconnect integrations

Last updated on Oct 20, 2026

Send your orders to a Google Sheet

For: Owners, Operations Where: Setup > Integrations > Google Sheets Available: Web dashboard · All countries Many teams keep a sheet of their orders for accounting or stock. Connect Google Sheets, and Zyda adds a row for every new order, so nobody copies orders by hand. How it works Each order adds one row to the tab you choose, when the order is placed. This includes orders from your website, your app and your staff. The first column is always the Zyda order ID. If Zyda tries a row again, it checks this column, so the same order is never added twice. The order columns you chose, in the order they appear in the sheet Connect your sheet 1. Go to Setup > Integrations and select Google Sheets. 2. Under 1. Share your spreadsheet, copy the Zyda email address. 3. In Google Sheets, share your spreadsheet with that address, as an Editor. 4. Under 2. Spreadsheet URL, paste the link of your spreadsheet. Select Load tabs. 5. Choose the tab. 6. Under 3. Order columns, tick the order details you want. Use the arrows to put them in order. 7. Select Save export. New orders start after you save. Earlier orders are not added. The order details you can add Order number, Submitted at, Status at submission, Order type, Branch, Customer name, Customer phone, Total, Subtotal, Delivery fee, Payment method, Payment status at submission, Voucher code, Origin, Items and Item notes. Each row shows the order as it was when it was placed. Later status changes do not update the row. When something goes wrong If Google refuses a row, the export pauses and the sheet shows why. Fix the problem, then select Save export again. Orders placed during the pause are added after you save. | You see | Fix | |---|---| | Sheet columns changed. Save the tab again to resume export. | Put the header row back, or choose an empty tab, and save. | | This spreadsheet is already connected to another restaurant. | Use another spreadsheet. One spreadsheet works for one store. | | This tab already has different columns. Choose an empty tab or the same columns. | Choose an empty tab, or the same columns. | Rules and limits - Use an empty tab, or a tab whose header row already matches your columns. - The sheet gets your customers' names and phone numbers if you choose those columns. Share the spreadsheet with care. - To stop the export, select More, then Disconnect. Common questions Can I send status changes to the sheet too? No. The sheet gets one row when the order is placed. To follow every status change, use webhooks. See Set up webhooks and API keys. Related articles - Set up webhooks and API keys - Find, connect and disconnect integrations - Find and follow orders on the Orders page

Last updated on Oct 20, 2026

Set up webhooks and API keys

For: Owners, Operations Where: Setup > Integrations > Webhooks, API keys Available: Web dashboard · All countries Your ERP, accounting tool or your own app may need your orders as they happen, or may take orders that should be in Zyda too. Webhooks send your orders out. API keys let your system send orders in. You set both up here; your developer does the rest. How it works - A webhook is a web address (URL) of your system. Zyda sends it each order event you choose, such as "Order placed". Each request is signed with the webhook's secret, so your system can check it came from Zyda. - An API key lets your system send orders to Zyda, for example orders you took on a delivery app or by phone. Your developer needs the guide Connect your own system: orders API and webhooks. Both pages link to it as API guide. The Webhooks page with two webhooks Add a webhook 1. Go to Setup > Integrations and select Webhooks. 2. Select Add webhook. 3. Enter the URL. It must start with https://. 4. Under Events, tick what to send: Order placed, Status changed, Order paid, Order canceled. 5. Under Order details, untick any part you do not want to send: Customer name and phone, Delivery address, Items, Payment and totals. The order number, status, times, branch and source are always sent. 6. Select Save. 7. Copy the secret and give it to your developer. You see it only once. Select Done. Adding a webhook: the URL and the events to send Check that your system receives orders 1. On the webhook's row, select More actions (the three dots). 2. Select Send test event, choose an event and select Send. Zyda sends a made-up order, number TEST-0001. You see Delivered or Not delivered, with your system's answer. To see real deliveries, select Delivery log. It shows the last 30 days. Open one to see what was sent and the error. Select Send again to repeat it. What the state badge means | Badge | Meaning | |---|---| | On | Sending. | | Failing | Sending, but the last deliveries failed. The row says how many in a row. | | Off | You turned off Send events. | | Turned off | Zyda turned it off after 50 failed deliveries in a row. The row shows the last error. | To turn a webhook back on, open it, turn on Send events and save. The failure count starts again. Make a new secret If the secret leaked, select More actions, then New secret. The old secret stops working at once. Give the new one to your developer. Create an API key 1. Go to Setup > Integrations and select API keys. 2. Select Create key. 3. Optional: give it a Name, such as ERP. 4. Select Create. 5. Copy the key and give it to your developer. You see it only once. Keep it secret, like a password. The page shows where your system sends orders: POST https://dashboard.zyda.com/api/v1/stores/orders. Each key row shows its first characters, when it was created and when it was last used. Revoke an API key 1. On the key's row, select More actions, then Revoke. 2. Confirm. Orders sent with this key are refused from now on. You cannot undo this. Rules and limits - A store can have up to 5 webhooks and up to 10 active API keys. - You reach these pages from Setup > Integrations. By default, only the Owner and Operations roles see it. - Orders sent with an API key need their order source turned on. See Choose the order sources your team records. - Deleting a webhook also deletes its delivery log. Common questions Does Zyda message my customer about an order my system sent? No. Zyda sends the customer nothing about these orders. My webhook shows Turned off. What now? Your system did not accept 50 deliveries in a row. Ask your developer to fix the URL. Then turn Send events back on. Related articles - Connect your own system: orders API and webhooks - Choose the order sources your team records - Send your orders to a Google Sheet

Last updated on Oct 20, 2026

Receive Zyda orders by webhook

For: Owners, Operations Where: Setup > Integrations > Webhooks, API keys Available: Web dashboard · All countries This guide is for the developer who receives a restaurant's Zyda orders in their own system, such as an ERP, a POS or a spreadsheet tool. To send orders to Zyda, see Connect your own system: orders API and webhooks. Add a webhook 1. In the Zyda dashboard, open Setup > Integrations > Webhooks. 2. Select Add webhook and enter your URL. 3. Choose the events you want. 4. Choose which parts of the order to send (see "Parts of the order"). 5. Select Save, then copy the webhook secret. Zyda shows it once. Keep it on your server only. The URL must start with https://, reach a public address, and hold no user name or password. Zyda refuses a private or internal address when you save it. Zyda does not follow redirects. From the same page the store can send a test event, read the delivery log of the last 30 days, send a past delivery again, make a new secret (the old one stops working at once), and turn a webhook off and on. Adding a webhook: the URL and the events to send Webhook events | Event | When Zyda sends it | |---|---| | order.created | The order is submitted. This is the first time it reaches the store. | | order.status_changed | Every status change after that: accepted, ready, dispatched, delivered, fulfilled, canceled, returned, deleted. Also when staff correct an order back to an earlier status. | | order.paid | The money is in: at submit for an order paid up front, or later when an online payment is recorded, when staff mark cash or card on delivery as collected, or when staff mark an on-account order as paid. | | order.canceled | The order is canceled. Zyda sends it together with its order.status_changed. | Every order of the store sends events, from any source, including live orders you sent with the orders API. These send nothing: - an order that is never submitted, for example an expired unpaid online order; - a recorded sale you sent with the orders API; - a dine-in table round. Its money is paid on the table. Zyda does not promise the order in which deliveries arrive. A retry can arrive after a later event. Use occurred_at and order.status to decide which state is newest. The webhook request Zyda sends an HTTP POST with a JSON body. | Header | Value | |---|---| | Content-Type | application/json | | User-Agent | Zyda-Webhooks/1 | | X-Zyda-Event | The event name, for example order.created. | | X-Zyda-Delivery | The delivery id. It is also delivery_id in the body. It stays the same on every retry of one delivery. | | X-Zyda-Signature | t=<unix seconds>,v1=<signature>. See "Check the signature". | The webhook body Every event has the same shape. This is version 1. - order.status is the status this event is about. - order.previous_status is the status before it. On order.created it is pending. - Times are ISO 8601, in UTC. - Amounts are numbers, in the store's currency. - test is true only for a test event. Example of order.status_changed: { "version": 1, "event": "order.status_changed", "delivery_id": "6f1c2a9e-0b7d-4c55-9a51-2f0e8d3b7c14", "occurred_at": "2026-10-14T10:32:00Z", "test": false, "store": { "id": 4321, "name": "Sample Store" }, "order": { "id": 880123, "number": "1042", "status": "accepted", "previous_status": "submitted", "created_at": "2026-10-14T10:20:05Z", "submitted_at": "2026-10-14T10:20:06Z", "due_at": "2026-10-14T10:50:06Z", "is_scheduled": false, "time_slot": null, "delivery_type": "pickup", "origin": "manual_order", "is_manual_order": true, "branch": { "id": 101, "name": "Main Branch" }, "channel": "whatsapp", "captured_by": "api", "taken_by": "staff", "customer": { "name": "Sample Customer", "phone": "+96550000000" }, "address": { "area": null, "city": null, "block": null, "street": null, "avenue": null, "building": null, "floor": null, "unit_no": null, "unit_type": null, "notes": null, "lat": null, "lng": null }, "items": [ { "id": 5550001, "menu_item_id": "a1b2c3d4-0000-4000-8000-000000000001", "variant_id": "123456", "name": "Burger patties, 6 pieces", "name_ar": null, "variant_name": "Regular", "quantity": 2, "unit_price": 4.75, "total_price": 9.5, "notes": "Extra fat", "options": [] } ], "payment": { "method": "CASH", "status": "paid", "cash_collected_at": null, "currency": "KWD", "subtotal": 9.5, "discount": 0.0, "voucher_code": null, "delivery_fee": 0.0, "service_fee": null, "tax": 0.0, "total": 9.5 } } } Only event, order.status and order.previous_status change between events: | Event | order.status | order.previous_status | |---|---|---| | order.created | submitted | pending | | order.status_changed | the new status | the status before it | | order.paid | the order's status at that time | the status before it, if the same change moved the status. Otherwise null. | | order.canceled | canceled | the status before it | Notes on the fields: - channel is the order source key, for example website, phone or talabat. See "Order sources". - captured_by is the system that recorded the order. It is api for an order you sent. - taken_by is who took the order: customer, staff, ring_agent or ai_agent. - Each entry in items[].options holds name, name_ar, quantity and price. - For cash and card on delivery, payment.status can read paid before collection. cash_collected_at is set, and order.paid sent, when staff mark it collected. - discount includes the voucher. - channel, captured_by, taken_by and cash_collected_at can be null on older orders. Parts of the order Each webhook can leave out any of these parts: customer (name and phone), address, items and payment. A part that is left out keeps its keys. Each value is null, and items is []. So the shape of the body never changes. Check the signature Check every request before you trust it. 1. Read t and v1 from the X-Zyda-Signature header. 2. Build this text: the value of t, a dot, then the raw request body exactly as you received it. For example 1760437920.{"version":1,...}. 3. Compute HMAC-SHA256 of that text. Use the webhook secret as the key. Write the result as lowercase hex. 4. Compare your result with v1. Use a constant-time compare. If they differ, refuse the request. 5. Refuse the request if t is more than a few minutes away from your clock. This stops someone from sending an old request again. Use the raw body. If you parse the JSON and write it again, the bytes change and the signature no longer matches. Node.js example (the steps above work the same in any language): const crypto = require('crypto'); function verifyZydaSignature(rawBody, signatureHeader, secret, toleranceSeconds = 300) { const parts = Object.fromEntries( String(signatureHeader || '').split(',').map((part) => { const at = part.indexOf('='); return [part.slice(0, at).trim(), part.slice(at + 1).trim()]; }) ); const t = parts.t; if (!t || !parts.v1) return false; if (Math.abs(Date.now() / 1000 - Number(t)) > toleranceSeconds) return false; const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex'); const a = Buffer.from(expected, 'utf8'); const b = Buffer.from(parts.v1, 'utf8'); return a.length === b.length && crypto.timingSafeEqual(a, b); } Answer quickly, and retries - Answer with any 2xx status within 10 seconds. Zyda waits 5 seconds to connect. Do slow work after you answer, for example in a queue. - The store sees the first 2 KB of your answer in the delivery log. - A timeout, a network error, 5xx or 429 is tried again after 1 minute, 5 minutes, 15 minutes, 1 hour, 3 hours, 6 hours and 14 hours: 8 tries in all, over about a day. - Any other answer, including other 4xx and a redirect, fails the delivery at once. One exception: a Google Apps Script web app (script.google.com) that answers 302 or 303 counts as delivered, because the script ran. Zyda still does not follow the redirect. - The same delivery can reach you more than once. Drop repeats by X-Zyda-Delivery. - After 50 failed deliveries in a row, Zyda turns the webhook off. A delivery counts as failed only after all its tries. The store turns it on again with Send events. A test event sent from the dashboard has "test": true, a delivery_id that starts with test_, and a made-up order with id 0 and number TEST-0001. Related articles - Connect your own system: orders API and webhooks - Set up webhooks and API keys - Choose the order sources your team records - Send your orders to a Google Sheet

Last updated on Oct 20, 2026

Connect email, automation and other tools

For: Owners, Operations Where: Setup > Integrations Available: Web dashboard · All countries Besides ads and analytics, the Integrations page connects email tools, automation tools, team chat and more. It also lets you use your own Google Maps key for the map on your store. How it works Most of these tools need Zyda to turn them on for your store first. Until then, their rows show Available on request, and you cannot connect them. Ask your Zyda account manager to turn them on. Once they are on, each tool asks for the keys from your account with that tool. Each field in the sheet says where to find its key. Tools that show Available on request The tools and what they ask for | Section | Tool | You enter | |---|---|---| | Customer Acquisition | Google Ads | Conversion ID (AW-…) | | Customer Acquisition | Pinterest | Tag ID, Ad Account ID, Conversions API Token | | Customer Lifecycle | Klaviyo | Public API Key (Site ID), Private API Key | | Customer Lifecycle | Mailchimp | API Key, Audience ID, Data Center ID | | Customer Lifecycle | Engage | Public Key, Private Key, Default List ID (optional) | | Customer Lifecycle | MoEngage | API ID, API Key | | Customer Lifecycle | OneSignal | App ID | | Mobile App | AppsFlyer | S2S API Token | | Mobile App | Adjust | App Token | | Measurement | Delighted | API Key, Channel | | Workflow & Custom | Zapier | Zapier Webhook URL | | Workflow & Custom | Custom Webhook | Webhook URL | | Workflow & Custom | Pipedream | Pipedream Source URL | | Workflow & Custom | Slack | Incoming Webhook URL | | Workflow & Custom | Discord | Webhook URL | AppsFlyer and Adjust are only useful if you have your own store app. Connect a tool 1. Go to Setup > Integrations and select the tool. 2. Fill in each field. A field marked secret is never shown again after you save. 3. Select Connect. To change a key later, select the row again. Leave a secret field blank to keep the saved value. Use your own Google Maps key Your store's map and address search use Zyda's Google Maps key. You can use your own key instead. 1. In a Google Cloud project, turn on the Maps JavaScript API and the Places API. 2. Create a key under APIs & Services, then Credentials. Limit it to your store's web addresses. 3. In Zyda, under Location Services, select Google Maps. 4. Paste the key in Google Maps API Key and select Connect. To go back to Zyda's key, select More, then Disconnect. Rules and limits - Custom Webhook in this list is not the same as Webhooks. For signed order events to your own system, use Webhooks. See Set up webhooks and API keys. - Google Ads can also run from your own Google Tag Manager container. See Connect Google Analytics 4 and Tag Manager. - A Google Maps key is not secret. It is shown in full. Common questions Why can't I select Klaviyo? It shows Available on request. Zyda must turn it on for your store first. Ask your account manager. Related articles - Find, connect and disconnect integrations - Connect Google Analytics 4 and Tag Manager - Set up webhooks and API keys

Last updated on Oct 20, 2026