Source: https://dzbuild.com/docs/addons/ab-testing.md # A/B Testing for Landing Pages **Category:** Marketing  ·  **Min plan:** Pro  ·  **Slug:** `ab-testing` A/B testing lets you run two or more versions of your landing page on **one single link**, split the visitors between them automatically, and see which page actually brings more orders. It is built for merchants who pay for traffic: you put one link in your ad, and DZBuild tells you which page deserves that budget. ## Video tutorial [A/B Testing for Landing Pages](https://www.youtube-nocookie.com/embed/Mz2lm96a-Kc) ## Features * One unique test link that rotates visitors between your landing pages * Equal split by default, custom weights when you want them * Visitors, orders, conversion, average order value, confirmation and delivery rate per page * A clear winner verdict with real statistical confidence * End the test and the same link sends everyone to the winner — no ad changes needed * QR code for the test link ## What it does The add-on adds a new **A/B Testing** page to your dashboard sidebar at `/dashboard/ab-tests`. There you pick between **2 and 5** of your published landing pages, give the test a name, and DZBuild generates a single short test link on your own store address: ``` https://yourstore.dzbuild.app/t/k7m3qptr ``` If your store runs on a verified custom domain, the test link uses that domain instead. That link is the only one you share. Every visitor who opens it is sent to one of the pages in the test, in rotation, and everything they do afterwards — the order, the confirmation, the delivery — is credited back to the page they landed on. Each page in a test gets a letter: **A**, **B**, **C**, **D**, **E**. ## How the test link works * **Rotation.** Visitors are handed out in turn, so with equal weights the split stays even across the whole test, not just on average. * **Weights.** By default every page gets the same share. In the traffic split step when you create the test, or later when you edit it, you can give a page a bigger share, from `1` to `99`, if you want most of your traffic to keep going to the page you already trust. * **Sticky visitors.** Once a visitor has been sent to a page, they keep getting that same page for 30 days. A customer who comes back tomorrow does not see a different version. * **Ad parameters are kept.** Everything after the `?` in your ad link — `fbclid`, `utm_source` and the rest — is passed through to the landing page, so your Pixel and campaign reporting keep working exactly as before. See [Marketing → Pixels](https://dzbuild.com/docs/marketing/pixels.md). * **Bots do not count.** Link previews and crawlers (the WhatsApp or Facebook preview when you paste the link, for example) are not counted as visitors and do not consume a rotation slot. * **Speed is untouched.** The split happens on the test link itself, before the page, so your landing pages load exactly as fast as they normally do. tip Only visitors who came through the test link can produce a counted order. If you also send traffic straight to one of the pages by its normal `/landing/...` address, orders from those visitors are not counted in the test at all, so put only the test link in your ads. If a page ever shows more orders than visitors, the results page flags it with a warning. ## Benefits * **You stop guessing which page sells.** Two headlines, two offers, two price displays — the numbers decide, not opinion. * **You never touch your ad again.** The same link stays in your campaign from the first day of the test until long after you have picked a winner, so you keep your ad's learning, comments and social proof. * **You compare what really matters in Algeria.** Beyond raw conversion, you can decide the winner on **confirmation rate** or **delivery rate** — the page that brings orders customers actually confirm and actually receive, not just the page that fills the most forms. * **You know when the result is real.** DZBuild refuses to announce a winner until there is enough data, so you do not kill a good page after twenty visitors. * **Nothing is thrown away.** Ending or deleting a test never deletes a landing page, and the winning page keeps living at its own address. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **A/B Testing** under *Marketing*. 3. Click **Activate** — the add-on requires the **Pro** plan or higher. 4. A new **A/B Testing** entry appears in the dashboard sidebar, and the management page opens right away. warning You need at least two **published** landing pages before you can create a test. A landing page that is still a draft appears in the picker but cannot be selected, and neither can a page that is already used in another live test. See [Landing Pages](https://dzbuild.com/docs/selling/landing-pages.md). ## Using it ### Create a test 1. Go to **A/B Testing** in the sidebar and click **New test**. 2. Give the test an internal name — your customers never see it. 3. Pick **2 to 5** landing pages. Each one shows its view count, and unavailable pages show why (draft, already in another test, or not available on your plan). 4. Click **Next** to set the traffic split. Every page gets an equal share by default; change the numbers to give a page more traffic, or leave it equal. 5. Click **Next** and choose **what decides the winner**: * **Conversion to order** — the page that turns the most visitors into orders. This is the default. * **Average order value** — the page that produces bigger orders. * **Confirmation rate** — the page whose orders customers actually confirm. * **Delivery rate** — the page whose orders actually get delivered. 6. Click **Create test**. The test starts running immediately and your test link is shown, with buttons to **copy** it, **open** it, or display its **QR code**. A store can keep **5 tests running at a time** and **50 tests in total**. Deleted tests still count toward the 50. ### Read the results Open a test to reach its results page. At the top you get total **visitors**, **orders** and **revenue** for the whole test, plus a verdict card: | Verdict | What it means | | ------------------- | ------------------------------------------------------------------- | | Collecting visitors | Not enough data yet — no page is declared ahead | | Results too close | Enough data, but no meaningful gap between the pages | | Slightly ahead | One page leads with at least 80% confidence — keep the test running | | Ahead | One page wins with at least 95% confidence — you can end the test | Below it, one row per page shows **visitors, orders, conversion rate, average order value, revenue, confirmation rate, delivery rate** and a 14-day visitors trend. The best-performing page carries a badge. The page refreshes itself every 60 seconds, and there is a manual refresh button next to the table. tip A page with fewer than 30 visitors shows a dash instead of its rates. That is deliberate — one order out of five visitors is not a 20% conversion rate, it is noise. Before any winner is announced, all of these must be true: the goal's minimum sample on the *weakest* page (**100 visitors** for the conversion goal, **15 orders** for confirmation, **10 orders** for average order value, **10 confirmed orders** for delivery), **25 orders** across the whole test, and **72 hours** of runtime. The 3-day floor is there so a good Thursday does not get mistaken for a winning page. ### Adjust a running test * **Edit** — rename the test or change the traffic weights at any time. * **Remove a variant**: stops sending new visitors to that page and redistributes its share to the others. The removed page also leaves the results page: its row, visitors, orders and revenue no longer appear in the table, the totals or the verdict. A test must always keep at least two pages. ### End the test and keep the link Click **End test**, choose the page that everyone should get from now on — the leading page is marked **Recommended** — and confirm. From that moment: * the test stops splitting traffic; * **the same test link keeps working** and sends every visitor to the winning page; * your ads, posts, QR codes and bio links need no change at all. warning Ending a test cannot be undone. If the results page still says the data is insufficient, ending now may crown the wrong page — the confirmation dialog warns you when that is the case. Deleting a test removes it from your dashboard and stops the split for good. The test link keeps working: it sends everyone to the winning page, or to the first page still in the test if you delete it before ending it. Your landing pages are never deleted. ## FAQ **Do I have to change my ad when the test is over?** No. That is the whole point of the test link. You end the test, pick the winner, and the link you already published starts sending everyone to that page. **Will the same customer see a different page every time?** No. A visitor is assigned to one page and keeps it for 30 days, so a customer who comes back to finish an order finds the same page, the same offer and the same price. **Why does my test say there is not enough data yet?** Because at least one of the three gates is not met: enough visitors or orders on the weakest page, 25 orders across the test, and 72 hours of runtime. Landing-page conversion in Algeria is usually only a few percent, so a fair test needs a few days of real traffic. **Can I put the same landing page in two tests at the same time?** No. A page can only belong to one live test, so the numbers stay unambiguous. Finish or delete the first test and the page becomes selectable again. **Do orders that arrive after I end the test still count?** Yes. A visitor who was assigned to a page before the end can still order afterwards, and that order is credited to the page they saw. See [Orders](https://dzbuild.com/docs/selling/orders.md). ## Related * [Landing Pages](https://dzbuild.com/docs/selling/landing-pages.md) — build the versions you are going to test * [Pixels](https://dzbuild.com/docs/marketing/pixels.md) — keep Meta and TikTok attribution working on tested pages * [Add-ons overview](https://dzbuild.com/docs/addons/overview.md) — the full add-on catalog and plan requirements --- Source: https://dzbuild.com/docs/addons/advanced-analytics.md # Advanced Analytics for Your Store **Category:** Marketing  ·  **Min plan:** Enterprise  ·  **Slug:** `advanced-analytics` Advanced Analytics gives your store real-time visitor analytics — how many people are on your site right now, where they came from, which pages they read, which devices and countries they use — next to your own revenue and conversion numbers. It is built for Enterprise merchants who have outgrown the built-in dashboard charts and want to know *why* orders go up or down, not just *that* they did. Visitor data is collected by a private analytics instance hosted by DZBuild, not by Google or Facebook, and the storefront script sets no cookies. ## Video tutorial [Advanced Analytics for Your Store](https://www.youtube-nocookie.com/embed/vnh9PDfNXFk) ## Features * Real-time visitor count * Daily / weekly / monthly traffic * Top pages and referrers * Device, browser, OS breakdown * Country and region breakdown * Self-hosted (no Google / Facebook) * Bandwidth-light (1.5 KB script) * GDPR-friendly (no cookies) ## What it does Activating the add-on adds an **Advanced Analytics** entry to your dashboard sidebar and a dedicated page at `/dashboard/addons/advanced-analytics`. Once you switch analytics on for your store, a very small tracking script is added to your storefront pages. Every visit is counted there — with no cookie and no customer data sent to a third party. Within minutes of the first real visits, the page starts filling with data. The page has two families of numbers side by side: 1. **Visitor numbers** — Visitors, Pageviews, Sessions and Bounce rate, plus a live visitor pill in the header. 2. **Money numbers** — Revenue (delivered), Revenue (pending), Average order value and Conversion rate, read from your own orders, in `DZD`. Below the cards you get a traffic chart, a revenue and orders chart on the same time buckets, a Top products table, and four breakdown panels — Top pages, Traffic sources, Countries and Devices. ### How the revenue numbers are counted * **Revenue (delivered)** — the total of orders whose status is `delivered`. This is recognized revenue. * **Revenue (pending)** — orders that are `confirmed`, `processing` or `shipped` — money still in flight. * **Average order value** — delivered revenue divided by the number of delivered orders. * **Conversion rate** — orders in the period divided by visitors in the period. * **Top products** — ranked by revenue from `delivered` orders only, with units and order count. warning The conversion rate needs visitor data to be meaningful. If your store had orders before analytics was switched on, the visitor count for that period is lower than the order count, so the card shows a **collecting data** state instead of a misleading percentage. Give it a full period after activation before reading it. ## Benefits * **See the traffic, not just the orders.** The built-in dashboard tells you how many orders you got. This tells you how many people had to see the store to produce them — the number you need before spending more on ads. * **Know which page sells.** Top pages tells you whether your product pages, your [landing pages](https://dzbuild.com/docs/selling/landing-pages.md) or your home page are doing the work. * **Know where buyers come from.** Traffic sources separate Facebook, TikTok, Google and direct visits, so you can stop paying for a channel that sends visitors who never order. * **Match the store to the customer's phone.** The device and browser breakdown shows what your Algerian buyers actually use, which tells you what to test your checkout on. * **See traffic and revenue on the same timeline.** A traffic spike with no revenue spike is a page problem, not a marketing problem — the two charts sit one above the other so the gap is obvious. * **Watch a campaign live.** The real-time visitor count updates while the ad is running, so you know within minutes whether a launch is landing. * **Privacy-friendly by design.** No cookies, nothing handed to Google or Facebook, and a script light enough that it does not slow your storefront down. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Advanced Analytics** under *Marketing*. 3. Click **Activate**. The add-on requires the [Enterprise plan](https://dzbuild.com/docs/plans/enterprise.md) — on a lower plan the card stays locked and activation is refused. 4. An **Advanced Analytics** entry appears in the dashboard sidebar. 5. Open the page and click **Activate now** on the *Activate analytics* banner. This is a one-time step per store — it switches tracking on for your storefront. tip The Enterprise plan is the only gate. Once your store is on it, **Activate now** switches tracking on by itself and there is nothing to request from support. Visitors are only counted from that click onwards, so turn it on the day before you want to read a full period rather than the day you need the numbers. ## Using it * **Range chips** at the top switch the whole page between **Last 24 hours** (the default), **Last 7 days**, **Last 30 days** and **Last 90 days**. Every card, chart and list re-reads on the new range. * **Live pill** in the header shows how many visitors are on your store right now. It refreshes about every 15 seconds and pauses while the browser tab is in the background. * **Traffic chart** is grouped by hour on the 24-hour range, by day on 7 and 30 days, and by month on 90 days. The revenue chart uses the same buckets, so the two line up. * **Top products** lists product, units, orders and revenue for delivered orders in the period. * **Top pages / Traffic sources / Countries / Devices** are ranked lists for the same period. * **Open full reports** opens the complete read-only reporting view in a new tab — sessions, funnels, real-time, UTM sources, performance, period comparison and breakdowns. It is view-only, so nothing there can change your data. * If the analytics service is briefly unreachable, the page shows a notice and keeps rendering from the last cached values instead of failing — your dashboard and your storefront are never blocked by it. Deactivating the add-on stops the page and the sidebar link but does **not** delete your history: re-activating it later reconnects to the same data. ## FAQ ### Which plan do I need? Enterprise. The add-on card is locked on Free, Pro and Unlimited, and activation is refused server-side on those plans. See [the Enterprise plan](https://dzbuild.com/docs/plans/enterprise.md) for what else is included. ### Is this the same as the analytics on my dashboard home page? No. The dashboard home page shows your orders, revenue, profit and product performance — see [Analytics](https://dzbuild.com/docs/marketing/analytics.md). This add-on adds the **visitor** side: who reached the store, from where, on what device, and how many of them turned into orders. ### Do I still need the Facebook Pixel? Yes. The Pixel and the Conversions API exist to optimize and attribute **ad delivery** inside Meta — see [Pixels](https://dzbuild.com/docs/marketing/pixels.md). Advanced Analytics is your own reporting, independent of any ad platform. They answer different questions and are normally used together. ### Why is my conversion rate empty or "collecting data"? Because visitors are only counted from the moment you clicked **Activate now**, while orders go back further. Until the visitor count for the selected period is at least as large as the order count, the card refuses to show a percentage rather than show a wrong one. Wait a full period and check again. ### Does it slow my store down? The storefront script is about 1.5 KB and loads deferred, so it does not block your pages. Nothing about the analytics page runs on your storefront checkout. --- Source: https://dzbuild.com/docs/addons/advanced-orders.md # Advanced Order Management **Category:** Orders  ·  **Min plan:** Unlimited (Enterprise included)  ·  **Slug:** `advanced-orders` Adds a dedicated CRM-style page with 12 fixed sub-statuses (confirmed, no answer, postponed, cancelled, fake, duplicate, customer cancelled, waiting customer call, busy line, at courier, returned, completed), call attempt tracking, and a full status timeline. The standard orders page itself is unchanged, but eight of the sub-statuses write through to the core order status — see [Sub-statuses that change the core order status](#core-status-mirror). ## Video tutorial [Advanced Order Management](https://www.youtube-nocookie.com/embed/l-SCiKSU2iM) ## Features * Dedicated CRM-style orders page * 12 fixed sub-statuses (no answer, busy line, postponed, fake, duplicate, etc.) * Call attempt tracking with notes * Full status change timeline per order * Filter & search by sub-status * Owner-only settings and per-agent team stats ## What it does DZBuild's standard orders page at [`/dashboard/orders`](https://dzbuild.com/dashboard/orders) is intentionally simple — it's about shipping the order. The Algerian COD reality is messier: orders need to be call-confirmed, customers don't always pick up, the line is busy, the order is fake, the customer asks to postpone, etc. This add-on activates a **second**, separate orders surface at [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced) that operators use to work the call queue. It tracks the 12 sub-statuses below, every call attempt with notes, and the full status-change timeline per order. The standard orders page itself is untouched — but setting certain sub-statuses does update the core order status behind it, as described below. ## The 12 sub-statuses The list is fixed in the add-on and cannot be extended — there is no way to create your own sub-status. | Sub-status | Used when | | ------------------------- | ------------------------------------------------------------------------------------------------------------ | | **Confirmed** | Order confirmed with the customer by phone | | **No answer** | Customer didn't pick up the call | | **Busy line** | Line was busy (try again later) | | **Postponed** | Customer asked to be called back later. No callback time is recorded, the order simply waits under this chip | | **Cancelled** | Cancelled by the store | | **Fake** | Obvious fake — random name/number, prank | | **Duplicate** | Same customer ordered twice; merge or cancel one | | **Customer cancelled** | Customer confirmed but later cancelled | | **Waiting customer call** | Customer asked to call you back | | **At courier** | Order handed off to the courier | | **Returned** | Courier returned the package | | **Completed** | Order delivered and paid | ## Sub-statuses that change the core order status Eight of the twelve sub-statuses are mirrored onto the order's core status: | Sub-status | Core status it sets | | ------------------------------------------------- | ------------------- | | Confirmed | `confirmed` | | Cancelled / Fake / Duplicate / Customer cancelled | `cancelled` | | At courier | `shipped` | | Returned | `returned` | | Completed | `delivered` | That mirror is not cosmetic. It commits or releases stock, stamps the delivery date when the order becomes delivered, updates the customer's order history, and triggers the same notifications and integration syncs a manual status change does: customer email, Telegram and Google Sheets. The remaining four — **No answer**, **Postponed**, **Busy line** and **Waiting customer call** — leave the core status alone (typically `pending`), so you can work the call queue without touching fulfillment. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Advanced Order Management** under *Orders*. 3. Click **Activate** (Unlimited plan required). 4. A new **Advanced Order Management** entry appears in the dashboard sidebar pointing to [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced). The add-on cannot be activated on the **Digital** theme. If your store switches to Digital, the card is shown as paused — the add-on stops running, but nothing is uninstalled and your sub-status data is preserved. ## How operators use it Each row on [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced) shows the order, the product, the customer and phone, the wilaya, the total, the core status, the current sub-status, the delivery state, the number of call attempts with the date of the last one, and quick actions: **Details**, **Call**, **Send** (to your courier, while the order is not sent yet) and **Print** (once it has a tracking number). Click a status or sub-status badge to change it. You can also tick several orders and send up to 50 at once to the courier you pick. The typical flow is: 1. Operator opens the queue. It is always sorted newest order first — there is no sort control. 2. Picks the next order, calls the customer. 3. Logs the call result. There are exactly five: *No answer*, *Busy*, *Answered*, *Wrong number*, *Callback requested*. (Postponed / Confirmed / Cancelled are sub-statuses you set separately — they are not call results.) 4. Adds free-form notes (e.g. "wants 2 pieces instead of 1"). 5. The order moves through the funnel until it's *At courier* or *Cancelled*. Every call attempt is timestamped and visible in the order's timeline alongside status changes — useful for performance reviews and dispute resolution. ### Narrowing the queue There is no sorting, only filters: * **Sub-status chips**, including a *Not defined* chip that shows untreated orders, and a *Return on the way* chip that lists returned orders whose stock has not come back yet. Tick those orders and click **Returns received** once the parcels are back with you, and their stock comes back. * **Core status** filter. * **Date period** — today, yesterday, 3 days, week, month, or a custom range. * **Search** — matches customer phone, customer name, order id or store sequence number. * **Per page**: 20, 50 or 100 rows. Those are the only three choices, and 20 is the default. * **Store filter** — team members with access to more than one store get a store selector in the toolbar, including an *all stores* combined view where each row shows which store it belongs to. The timeline only records dashboard changes Status changes made from the dashboard are recorded in the timeline. Automatic status updates pulled from the courier by the delivery-tracking sync are not. ## Owner-only settings The store owner can open **Settings** on the advanced orders page and require a written note before an agent may set specific sub-statuses — useful for *Fake*, *Cancelled* or *Customer cancelled*, where you want a reason on record. Staff members cannot open or change these settings. ## Team stats Also owner-only: the **Team** panel shows, for today and per agent, the number of confirmations, call attempts and actions, the orders assigned today, and the time of that agent's last activity. At the top of the same panel, **Order distribution** has a switch: when it is on, new orders are shared among your team, owner included, by the percentages you set, which must add up to 100%. Only orders that arrive after you save are shared out. While it is on, a team member cannot change the status of an order assigned to someone else, on this page or on the standard orders page, and cannot log a call on it. The owner can act on every order, and orders nobody was assigned to stay open to the whole team. ## Tips * Use the **Notes** field for actionable info only — long stories belong in CRM tools. * There is no callback scheduling: to work postponed orders, click the **Postponed** sub-status chip. * The **Fake** sub-status pairs well with [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) and [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md): together they reduce the call-confirm workload. * The advanced page is built for the call workflow, and it can also send orders to your courier and print their labels. Remember that the eight mirrored sub-statuses move the order along on the standard orders page at the same time. --- Source: https://dzbuild.com/docs/addons/apps.md # Install and manage apps on your store **Section:** Developer apps  ·  **Min plan:** set by each app  ·  **Installed by:** the store owner An app is a service made by an outside developer that works on your store through the DZBuild API. You install it from the app's own website: DZBuild shows you a consent screen that lists what the app will be able to do, and the app gets no access until you approve. Each installed app then has a page in your dashboard where you see what it changed, undo a change and remove the app. ## Where apps appear Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). Apps have their own section, **Developer apps**, below the installable add-ons of the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md). The section appears once DZBuild lists an app for every store or an app is installed on your store. An app you installed stays in that section even if DZBuild suspends it or stops listing it, so you can always remove it. Each card shows the app's name, its description and **Developed by** with the developer's name, plus one of these states: | What the card shows | What it means | | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Available** and an **Install** button | You can install the app. **Install** opens the app's website in a new tab, where the install starts. | | A plan name such as **PRO** and an **Upgrade to Pro** button | The app needs that plan. If it is already installed, it stops working on this store until you upgrade, and **Manage** stays on the card so you can still remove it. | | **Open** and **Manage** | The app is installed on this store. **Open**, when the app offers it, opens the app in a new tab and tells it which store you are working on. **Manage** opens the app's page in your dashboard. | | **Suspended** | DZBuild has suspended the app and it no longer has access to your store. **Manage** lets you remove it. | ## How to install an app 1. Click **Install** on the app's card, or go to the app's website directly, and start the install there. If you are not signed in to DZBuild, sign in first; the consent screen opens next. 2. Check the top of the screen: the app's name, **Developed by** with the developer's name, the app's website and its support email. An app DZBuild has reviewed carries the **Verified by DZBuild** badge. 3. Under **Choose the stores it will have access to**, tick one or more of your stores. The first store you can use is already ticked. One install covers up to 10 stores. 4. Read **What this app will be able to do**. The app gets these permissions and nothing more. 5. Click **Approve and install**. DZBuild sends you back to the app's website, which finishes the install. The app then shows in **Developer apps** on each store you ticked. Click **Deny** instead and you return to the app's website without giving it any access. The screen ends with a reminder that you can remove the app at any time from the Add-ons page. A store whose plan is below the app's minimum plan is greyed out with an **Unavailable** tag and the plan the app needs. When none of your stores qualifies, the screen says the app cannot be installed on your stores for now. If DZBuild has not approved the app or has suspended it, you see "This app is not available." instead of the consent screen. Only the store owner can install an app. A team member account sees **Store owners only** and is asked to have the owner install the app from their own account. ## What an app can be allowed to do The consent screen and the app's page show one line per area the app asked for. When the app asked to change an area, you see the line for changing it. These are the only permissions an app can ask for: | Area | Line for read access | Line for change access | | ------------- | --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | Store | See your store information and settings | See and change your store settings, design and theme | | Products | See your products | See, create, change and delete products | | Orders | See your orders, read only | Create and change orders | | Delivery | Not available to apps | Hand your orders to your delivery company | | Customers | See your customers and their details (name, phone, address) | Not available to apps | | Landing pages | See your landing pages | See, create, change and publish landing pages | | Promo codes | See your promo codes | See, create and change promo codes (this changes the prices your customers pay) | | Pixels | See your ad tracking pixels | See, add and change your ad tracking pixels | | Shipping | See your shipping rates and settings | See and change your shipping rates, and connect or disconnect your delivery companies | | Statistics | See your store statistics | Not available to apps | | WhatsApp | See the WhatsApp message templates, your balance and the history of sent messages | Send WhatsApp messages to your buyers about their orders (each message is charged to your WhatsApp balance) | Three of these areas need a second look before you approve: * **Delivery.** The app can hand orders to your courier without DZBuild asking you to confirm each one, and a send has no **Undo**. The [Claude](https://dzbuild.com/docs/addons/claude.md) connector, by contrast, waits for your approval on every send. * **Promo codes.** A code the app creates or changes applies to what your buyers pay at checkout. * **WhatsApp.** Each message is paid from your [WhatsApp Sender](https://dzbuild.com/docs/addons/whatsapp-sender.md) balance, like an automatic message. Some access is never available to an app. No permission covers AI generation, so an app cannot spend your AI credits. No permission covers your plan and payments, your team, your domains or your API keys either. An app also cannot undo changes: **Undo** stays with you, on the app's page. ## The app's page Click **Manage** on the app's card to open its page. It shows: * **Installed on**, **Last activity** (the last time the app used its access, or **Never used**) and **Installed by**, the account that approved the install. * **What this app will be able to do**: the permissions the app holds, in the same words as the consent screen. * **Its latest changes**: the 20 most recent changes the app made to your store, with **Undo** next to each change that can be rolled back. * **Notifications sent to the app**: whether your store sends the app notifications, and how the last one went. * **Remove the app**. * Links to the app's website and support email, and **Open** when the app offers it. An app that can see your orders may ask to be told when an order arrives or changes status. The notifications card then shows **Address verified** or **Address not yet verified**, **Sending paused** when sending has stopped, the number of failures in a row, and the last notification with its status: **Sending**, **Delivered** or **Delivery failed**. An app that takes no notifications gets a line saying so. Team members with the Add-ons permission (see [Team & permissions](https://dzbuild.com/docs/operations/team.md)) can open this page and the app itself. They see no **Undo** button, and the **Remove the app** card tells them **This action is reserved for the store owner.** ## Undo a change the app made The list covers changes to your store settings, design, theme and home page, categories, stock, promo codes, pixels, shipping rates and settings, and landing page sections. Other edits, such as a product's name or price or an order's status, are not listed and cannot be undone from this page. Click **Undo** next to a change and confirm. DZBuild puts back the value from before that change, and the button turns into an **Undone** tag. A change that created something new, such as a promo code or a category, has no **Undo** button: delete that item from its own page if you do not want it. If the item a change touched no longer exists, DZBuild refuses the undo and tells you why. ## Remove an app 1. Open the app's page with **Manage**. 2. Click **Remove the app** and confirm. The app loses access to the store at once, and the notifications still waiting to be sent to it are cancelled. You land on the Add-ons page with the message that the app was removed. Your products, orders and settings stay as they are, including what the app changed. Undo those changes before you remove the app, because its page and its list of changes go away with the install. Removing acts on the store you are working on. If the app is installed on several of your stores, switch to each one to remove it there (see [Multi-store](https://dzbuild.com/docs/operations/multi-store.md)). You can install the app again later from its website; the consent screen opens again. ## What it costs DZBuild adds no fee for installing an app. Apps work on every plan, Free included, unless the app sets a minimum plan. That plan shows on the app's card, and on the consent screen next to each store whose plan is too low; those stores cannot be ticked. If a store's plan later drops below the app's minimum, the app stops working on that store until you upgrade (see [Upgrades & downgrades](https://dzbuild.com/docs/plans/upgrades.md)). WhatsApp messages an app sends come out of your WhatsApp balance, as described above. ## For developers The guides for building an app on DZBuild are at [dzbuild.dev](https://dzbuild.dev). ## FAQ **Can a team member install an app?** No. Only the store owner can approve an install. A team member who opens the consent screen sees **Store owners only** and is asked to have the owner install the app from their own account. **Why does the install page say "This app is not available"?** DZBuild has not approved the app yet, or has suspended it. Until DZBuild approves it, an app works only on its developer's own stores. Contact the app's developer to find out when it will be available. **I approved the install, but the app does not show in Developer apps. What now?** Approving sends you back to the app's website, which finishes the install on its side. Start the install again from the app's website. A consent screen left open for more than 10 minutes answers that the install link is invalid or expired, and starting again from the app's website fixes that. If the app is still missing, write to the support email shown on the consent screen. **Can I give an app access to only some of my stores?** Yes. Tick only those stores on the consent screen, up to 10 per install. Each store keeps its own install, so you can remove the app from one store and keep it on another. --- Source: https://dzbuild.com/docs/addons/captcha-protection.md # Captcha Protection **Category:** Security  ·  **Min plan:** Pro  ·  **Slug:** `captcha-protection` Add ALTCHA Sentinel verification to ALL checkout forms — fast checkout on the product page, full checkout, and every order form on landing pages. Stops bots, fake orders, and VPN spam at the door without annoying real customers. ## Video tutorial [Captcha Protection](https://www.youtube-nocookie.com/embed/EIhgeNM11Fk) ## Features * ALTCHA Sentinel verification on fast checkout, full checkout & landing pages * Self-hosted — no Google reCAPTCHA, no third-party tracking * Three security levels: Normal, High and Aggressive * Invisible to real customers on Normal * VPN / proxy / Tor blocking on High and Aggressive * Strict mode: blocks orders with missing or invalid verification * Emergency platform-wide kill-switch support can flip for you ## Why use it Algerian COD stores get hammered by: * **Fake orders** — random names + numbers entered by bots or competitors * **Repeat-IP spam** — same VPN IP placing dozens of orders * **Headless scrapers** — automated tools placing orders to test cards or harvest your inventory ALTCHA Sentinel runs a small proof-of-work challenge in the customer's browser before the order submits. On the default Normal level real customers don't see it — the challenge solves in the background within milliseconds. Bots either fail or take too long. Nothing is filtered before the page renders: the widget always loads, and the decision to accept or reject is taken when the order is submitted. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Captcha Protection** under *Security*. 3. Click **Activate** (Pro plan required). ## Security level The add-on has one setting, **Security level**, reached from the **Settings** button on its card: | Level | What it does | | --------------------------------- | ------------------------------------------------------------------------------------------------- | | **Normal** (default, recommended) | Invisible verification. VPN / proxy / Tor visitors are not blocked. | | **High** | Also blocks VPN / proxy / Tor visitors. | | **Aggressive** | Blocks VPN / proxy / Tor, and shows the customer a challenge to solve when they submit the order. | Stay on Normal unless fake orders are actually costing you Genuine buyers have been rejected at checkout on **High**. If you switch to High or Aggressive, watch your order count for a day, and switch back to Normal the moment orders drop. A blocked buyer sees a generic error and usually leaves rather than contacting you, so the loss is invisible unless you look for it. Two things to know about changing the level: * **One-hour grace window.** After you switch level, verifications coming from pages that were loaded under the old level keep working for one hour, so customers mid-checkout are not rejected. * **Silent fallback.** If a level is temporarily unavailable, protection quietly reverts to Normal rather than failing or disabling the widget. ## Which forms are covered The widget renders on: * the **full checkout** page, * the **product page**, including all five fast-checkout layouts, * **landing page** order forms. It is not applied to orders you create yourself from the dashboard. The **Digital** theme product page has no order form of its own: its buy button takes the customer to the checkout page, which carries the widget. ## How it behaves * **Real customer**: nothing visible on Normal. On Aggressive, a challenge appears at submit. * **Bot / headless / suspicious IP**: order is rejected with a generic error. The customer is not told they were flagged (so attackers can't iterate against the rule). * **Strict mode**: an order with a missing or invalid verification is rejected. When the fault is on our side, for example when the verification service itself fails, orders go through rather than being blocked. * **Fake Meta-paid traffic (High and Aggressive only)**: an order whose tracking tags claim it came from a paid Meta campaign, but which shows no genuine sign of having arrived from Facebook or Instagram, is rejected with the same generic message. * **Verification that never completes**: if the browser cannot load or finish the challenge, for example because an ad blocker blocks it, the order is rejected with the same generic error. That is the main way a genuine customer can be blocked, and it is the reason Normal is the recommended level. * **Changing mobile IP is fine**: a customer whose IP changes between page load and submit — CGNAT rotation, WiFi to mobile data — is no longer blocked for it. ## Emergency kill switch If something goes wrong (you launched a campaign and verification is misbehaving for some segment), support can turn checkout verification off platform-wide. Orders start flowing without verification within seconds. Contact support if you need this. ## Tips * Pair with [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) for layered defense — captcha stops bot signatures, IP limit stops human-driven spam from a single IP. * Pair with [Advanced Order Management](https://dzbuild.com/docs/addons/advanced-orders.md) — your *Fake* sub-status will see far less use after enabling captcha. * Captcha doesn't slow your store down. The proof-of-work runs in a Web Worker so even slow phones don't lag. * Self-hosted means no data leaves DZBuild — unlike Google reCAPTCHA, no third party sees your customers' browsing. --- Source: https://dzbuild.com/docs/addons/cascading-variants.md # Cascading Variants **Category:** Products  ·  **Min plan:** Pro  ·  **Slug:** `cascading-variants` Create dependent variant groups — e.g., Brand → Model. Child groups only appear when the parent option is selected. ## Features * Parent-child variant groups * Brand → Model cascading * Works with color and text variants * Compatible with variant stock tracking * Compatible with combination stock ## When to use If you sell phone cases, car parts, replacement batteries, or anything where the customer flow is *"pick a brand, then pick a compatible model"*, this add-on cleans up the variant picker: * Without it: every Brand×Model pair has to be its own product, or you accept long flat dropdowns where the customer can choose impossible combinations. * With it: Brand is shown first; once chosen, only the matching Model options are revealed. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Cascading Variants** under the *Products* category. 3. Click **Activate** (Pro plan required). 4. Open a product at `/dashboard/products/create` or `/dashboard/products/{id}/edit` → the **Variants** section now exposes a **Depends on** picker. It appears on the second and later variant groups only — the first group has no possible parent. ## Setup walkthrough A child group maps to **one parent option**, not to a whole parent group. So you create one child group per parent option: 1. Create the parent group **Brand** with options *Apple*, *Samsung*, *Xiaomi*. 2. Create one separate child group per brand — **Apple models**, **Samsung models**, **Xiaomi models** — each holding only that brand's models. 3. On each child group, set **Depends on** to the matching parent option. The dropdown lists entries as *Brand → Apple*. Leaving it blank means the group is always visible. 4. Save. The storefront shows only the child group whose parent option the customer picked. Each child group can depend on exactly one parent option. ## Compatibility * Hide/show works for `color`, `text` and `image_text` groups. Note that on product pages, when the customer switches parent option, an `image_text` option in the branch being left keeps its visual highlight even though the selection itself has been cleared, so prefer `color` or `text` inside cascading child groups. * Switching the parent option clears every selection below it and recalculates the displayed price straight away. * Stock tracking is preserved at every level: option stock, combination stock, or product stock — see [Variants](https://dzbuild.com/docs/selling/variants.md). * Multi-level cascades are supported: Brand → Model → Year. Each child group declares the single parent option it depends on. ## Where the cascade applies * Product pages. * **Landing page** order forms. * The **Digital** theme product page, as long as the [Digital Product Variants](https://dzbuild.com/docs/addons/digital-product.md) add-on is not also driving that product. See the warning below. Do not put cascading variants and the Digital Product Variants accordion on the same product When the accordion mounts, it hides the standard variant picker and rebuilds the groups in its own list, and it leaves cascading child groups out of that list. The cascading add-on then shows and hides those child groups inside a picker the buyer can no longer see, so the child groups never appear at all and the buyer cannot choose a model. The accordion mounts only when the product has at least one non-cascading group. If every group on the product is a cascading child, the accordion bails out, the standard picker stays visible and the cascade works normally. Anything in between is broken, so on the Digital theme pick one of the two add-ons per product. Hidden child groups never block an order The customer only has to pick from the groups on screen. A customer who picks *Apple* never sees the *Samsung models* group, and the order goes through without a pick from it. ## Tips * Per-combination stock does not follow the cascade: the combination table pairs every option of every group, child groups included, so it does not shrink to the valid (Brand, Model) pairs and can reach the 1,000-combination limit. Track stock per option instead when the table gets too large. --- Source: https://dzbuild.com/docs/addons/chatgpt.md # Connect ChatGPT to Your Store **Category:** Tools  ·  **Min plan:** Enterprise  ·  **Slug:** `chatgpt` The **ChatGPT** add-on connects ChatGPT or Codex (by OpenAI) directly to your DZBuild store. Once connected, you chat to create products, generate full AI landing pages, look up orders and read your store analytics, without clicking through the dashboard. It works as an app inside ChatGPT with **Developer mode** switched on, and as an **MCP server** in Codex. ## Requirements * A paid ChatGPT plan: Plus, Pro, Business, Enterprise or Edu. Developer mode is switched on from the ChatGPT web app; the mobile apps cannot turn it on. * On Business, Enterprise and Edu workspaces, an administrator may have to allow developer-mode apps first. * Your DZBuild store on the **Enterprise** plan, with the ChatGPT add-on activated. ## Features * Create and update **products** by chatting * **Add product photos from a link** and manage variants (colours, sizes, stock per option or per combination) * Generate **complete AI landing pages** for a product and publish them * Add, move, hide and delete the **sections of your home page**, such as a row with one category's products * Ask about **revenue, top products, visitors and conversion** in plain language * Look up **orders**; create, edit or cancel one, or hand it to your delivery company, each after you confirm in ChatGPT * Works in **ChatGPT (Developer mode) and in Codex** * **Your API key stays hidden**: created on our servers, never shown, revoked in one click * You approve exactly which of your stores ChatGPT may access ## What it can and cannot do | ChatGPT can | ChatGPT cannot | | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | Read your store profile and analytics | Change your plan, billing or payment settings | | Create, update and delete products, photos and variants | Upload a file from your computer (send a link instead) | | Create landing pages, generate AI pages, edit a page's sections and check it before publishing | See customer data beyond what an order holds | | Read orders, and create, edit, cancel or ship one after you confirm | Manage staff, API keys or domains | | Change the store design and theme, store details, home page sections, shipping prices, couriers, pixels and promo codes | | | Manage categories, stock, quantity offers, buyer input fields and min/max quantity rules | | | List the settings changes it made and undo one | | **Every change waits for your confirmation.** ChatGPT shows each action that writes to your store (creating a product, cancelling an order, sending a parcel to the courier) and asks you to confirm before it runs. Without Developer mode, ChatGPT can only search and read your store data. ## How to connect 1. In your DZBuild dashboard, open **Add-ons → ChatGPT** and activate the add-on. 2. Copy the connector link shown on the page: `https://mcp.dzbuild.com/mcp` 3. In ChatGPT (web), open **Settings → Security and login** and turn on **Developer mode**. 4. Open **ChatGPT Plugins**, press the plus button and paste the link. 5. ChatGPT opens a DZBuild page. Sign in, tick the store or stores ChatGPT may use and press **Approve and connect**. A store shows as **Unavailable** until it is on the Enterprise plan with the ChatGPT add-on active. In Codex, add the same link as an MCP server. The sign-in and approval steps are the same. You can revoke the connection at any time from the **Add-ons → ChatGPT** page. Connecting again from ChatGPT replaces the previous ChatGPT connection for that store. ## Things to try * "Create a new product called Natural Honey priced at 4500 DA." * "Add this photo to the honey product: " * "Add sizes S, M and L to the t-shirt, with 10 in stock for each." * "Generate a landing page for the honey product." * "Add a section to my home page with the products of the Honey category." * "How many orders did I get this week, and what is my best-selling product?" * "Find the orders from 0555 12 34 56 and send the pending one to the courier." Photos come from a link: ChatGPT cannot upload a file from your computer, so give it a public image URL and DZBuild downloads and hosts the image. Private links and links that need a login are refused. ## AI landing pages use your credits When you ask ChatGPT to generate a landing page, it uses your store's **AI credits** (the same credits as the dashboard AI generator: 20 for a medium page, 45 for a tall one). ChatGPT tells you before it spends them. You can top up credits from the **AI Credits** page in your dashboard. ## Security * The connection uses a standard secure sign-in (OAuth). You approve it once, from your own logged-in account. * The key that lets ChatGPT talk to your store is created on our servers and **never displayed**, not even to you. On the add-on page you only ever see it masked. * **Only the store owner** can connect a store. Team members cannot. * Press **Disconnect** on the add-on page and ChatGPT loses access within about a minute. * Deactivating the add-on disconnects ChatGPT and Codex. A Claude connection on the same store is not affected. ## Availability The ChatGPT add-on is available on the **Enterprise** plan. If your store leaves the Enterprise plan or the plan expires, ChatGPT and Codex can no longer reach your store until it is back on an active Enterprise plan. --- Source: https://dzbuild.com/docs/addons/claude.md # Connect Claude to Your Store **Category:** Tools  ·  **Min plan:** Enterprise  ·  **Slug:** `claude` The **Claude** add-on connects the Claude AI assistant (by Anthropic) directly to your DZBuild store. Once connected, you can just chat with Claude to create products, generate full AI landing pages, look up your orders, and read your store analytics — no dashboard clicking, no copy-paste. It works as a **custom connector** inside Claude, so you use it from claude.ai in your browser, the Claude desktop app, or Claude Code. ## Video tutorial [Connect Claude to Your Store](https://www.youtube-nocookie.com/embed/GJ9K90gw9iE) ## Features * Chat with Claude to **create and update products** * **Add product photos from a link** — send Claude an image URL and it uploads it to your store * **Set up variants** (colours, sizes) with their own prices, stock, SKUs and photos * Generate **complete AI landing pages** for a product and publish them * Add, move, hide and delete the **sections of your home page**, such as a row with one category's products * Ask about **revenue, top products, visitors and conversion** in plain language * Look up your **orders**, create, edit or cancel one, and hand one to your delivery company after you approve the summary * Works in **claude.ai, Claude Desktop and Claude Code** * **Your API key stays hidden** — it is created on our servers and never shown * **One-click disconnect** whenever you want ## What it can and cannot do Claude connects with a limited, safe set of permissions: | Claude can | Claude cannot | | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | | Read your store profile | Change your plan, billing or payment settings | | Create, update and delete products | See your customers' full personal data beyond order info | | Add, reorder and delete product photos | Upload files from your computer (send a link instead) | | Create and change product variants | Manage staff, API keys or domains | | Create landing pages, generate AI pages, edit a page's sections and check it before publishing | | | Read your analytics (revenue, orders, visitors) | | | Read orders, create, edit and cancel them, and hand one to your delivery company after you approve the summary | | | Change the store design and theme, store details, home page sections, shipping prices, couriers, pixels and promo codes | | | Manage categories, stock, quantity offers, buyer input fields and min/max quantity rules | | | List the settings changes it made and undo one | | **A courier send waits for your approval.** Before Claude hands an order to your delivery company, DZBuild shows you a summary with the customer, the phone, the destination, the total and the courier, and nothing is sent until you approve it. A parcel handed to a courier cannot be recalled from the chat. Connected Claude before 5 September 2026? Disconnect it on the add-on page and connect it again once, so it can also handle orders and store settings. ## How to connect 1. Open your DZBuild dashboard and go to **Add-ons → Claude**, then activate the add-on. 2. Copy the connector link shown on the page: `https://mcp.dzbuild.com/mcp` 3. In **claude.ai**, open **Settings → Connectors** and choose **Add custom connector**. 4. Paste the link and continue. Claude opens a DZBuild page asking you to sign in and approve the connection. 5. Sign in, tick the store or stores Claude may use, and press **Approve and connect**. That's it: Claude can now help with your store. You approve exactly which of your stores Claude may access: one connection can cover several, and a store shows as **Unavailable** until it is on the Enterprise plan with the Claude add-on active. You can revoke the connection at any time from the **Add-ons → Claude** page. ## Things to try Once connected, just talk to Claude: * "Create a new product called Natural Honey priced at 4500 DA." * "Add this photo to the honey product: " * "Add sizes S, M and L to the t-shirt, with 10 in stock for each." * "Make the red variant use the second photo, and add 200 DA for the XL size." * "Generate a landing page for the honey product." * "Add a section to my home page with the products of the Honey category." * "How many orders did I get this week, and what is my best-selling product?" ### Photos and variants — what to expect * **Photos come from a link.** Claude cannot upload a file from your computer; give it a public image URL (from your supplier's site, a public drive link, anywhere publicly reachable) and DZBuild downloads and hosts the image for you. The first photo you add becomes the main one. Up to 20 photos per product. * **Changing variants replaces them all at once.** When Claude edits variants it rewrites the whole set, so it will read the current ones first and send them back together with your change. If something looks wrong afterwards, the dashboard's product editor is always the source of truth. * Private or internal links are refused for security, and so are links that need a login. ## AI landing pages use your credits When you ask Claude to generate a landing page, it uses your store's **AI credits** (the same credits as the dashboard AI generator: 20 for a medium page, 45 for a tall one). Claude will tell you before it spends them. You can top up credits from the **AI Credits** page in your dashboard. ## Security * The connection uses a standard secure sign-in (OAuth). You approve it once, from your own logged-in account. * The key that lets Claude talk to your store is created on our servers and **never displayed** — not even to you — so it cannot be copied or leaked. On the add-on page you only ever see it masked. * **Only the store owner** can connect a store. Team members cannot. * Press **Disconnect** on the add-on page and Claude loses access within about a minute. ## Availability The Claude add-on is available on the **Enterprise** plan. If your store leaves the Enterprise plan or the plan expires, Claude can no longer reach your store until it is back on an active Enterprise plan. Deactivating the add-on disconnects Claude; a ChatGPT connection on the same store is not affected. --- Source: https://dzbuild.com/docs/addons/cross-sell.md # Cross-Sell — Frequently Bought Together **Category:** Storefront  ·  **Min plan:** Pro  ·  **Slug:** `cross-sell` After a customer places an order, the Cross-Sell add-on shows a "frequently bought together" popup with related products. The customer taps **+** on a product, confirms, and it is added directly to the **same** order — you then confirm the addition with them by phone. Set related products per product manually, or let the add-on suggest them automatically by category and best sellers. ## Video tutorial [Cross-Sell — Frequently Bought Together](https://www.youtube-nocookie.com/embed/1p23_NFg3sc) ## Features * "Frequently bought together" popup on the order-confirmation page * Customer adds a suggested product to the SAME order in one tap, with a confirmation step * Quick color/size pickers for products that have options * Set related products per product manually from a dashboard page * Auto-relation by category, then best sellers, when none are set manually * Cross-sell items are labeled in the orders dashboard and in [Advanced Order Management](https://dzbuild.com/docs/addons/advanced-orders.md) * The added product appears instantly in the order summary with a polished confirmation * Secure by design — the popup is tied to the order the customer just placed, with no impact on visitor sessions * Fail-safe — it never blocks an order or the confirmation page ## What it does This is a **post-purchase** upsell, not a cart upsell. The customer has already confirmed their order, so there is nothing left to lose: the suggestion appears on the confirmation page, under the order summary, styled with your store's own brand colour. Each suggested product carries a **+** button. Tapping it opens a small confirmation window that tells the customer, in your store's language, that the product will be added directly to their current order and that you will confirm with them shortly. If the product has options, quick color/size pickers appear right there; a quantity stepper lets them pick 1 to 50 pieces. On confirm, the product is appended as a new line on the existing order. ### How suggestions are chosen The add-on fills the popup in this order, and stops as soon as it has enough products: 1. **Your manual links** — the related products you set for the ordered products, in the order you arranged them. 2. **Same category** — other products sharing a category with what was ordered (only if **Auto-relate** is on). 3. **Best sellers** — your top-selling products (only if **Auto-relate** is on, and only if slots remain). Products already in the order are always excluded, and so are hidden products, inactive products, and stock-tracked products that are out of stock — the popup never suggests something the customer cannot receive. tip Turn **Auto-relate** off if you only want the exact pairings you chose by hand. With it off, a product with no manual links simply shows no popup. ## Benefits * **Higher average order value with zero extra ad spend.** The traffic is already paid for and the customer has already converted — every accepted suggestion is pure incremental revenue. * **No extra delivery cost per added item.** The added product joins the existing order, so the order keeps its single shipping fee instead of becoming a second delivery. * **One phone call instead of two.** You are already calling to confirm the order, so confirming the added item costs you nothing extra — a natural fit for cash-on-delivery selling in Algeria. * **Works even if you never configure anything.** With auto-relation on, the popup fills itself from your categories and best sellers from day one. * **Full traceability.** Every item the customer appended is labeled, so you always know which revenue came from cross-selling. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Cross-Sell — Frequently Bought Together** under *Storefront*. 3. Click **Activate**. The add-on requires the **Pro** plan or higher — on the Free plan the card stays locked and activation is refused. 4. Click **Settings** on the card to open the management page at `/dashboard/cross-sell`. warning Cross-Sell is **paused on the `digital` theme**. Digital stores deliver files instantly and have their own confirmation flow, so the card shows a paused state. Nothing is uninstalled — your links and settings are kept and come back the moment you switch to a physical-goods theme. ## Using it ### The settings card At the top of `/dashboard/cross-sell`: * **Auto-relate** — a toggle. When on, products with no manual links still get suggestions (same category first, then best sellers). On by default. * **Maximum suggested products** — how many products the popup may show, from `1` to `8`. Default `4`. * **Save settings** — applies both immediately. Three counters sit under the settings card: your total number of products, how many of them have suggestions set, and the total number of links you have created. ### Setting related products per product * The table lists your products, 20 per page, newest first. Archived products are not listed. * **Search** by product name or SKU. * The **Suggested products** column shows the current links as small chips with their thumbnails. Products with no links show a note, plus a hint that they will be suggested automatically when Auto-relate is on. * Click **Manage** on a row to open the picker. Search for products by name, click to select, and the chosen products appear as chips. You can pick up to **12** products per product; the popup then shows the first ones up to your **Maximum suggested products** setting. * Click **Save** in the picker. The new links appear on the row straight away. ### What the customer sees 1. They complete checkout and land on the order-confirmation page. 2. The "Frequently bought together" strip appears under the order summary, with a **+** on each product. 3. Tapping **+** opens the confirmation window with the price, the options pickers if the product has variants, a quantity stepper, and the exact amount that will be added. 4. On confirm, an animated confirmation shows the amount added and the **new order total**, and the product is inserted into the order summary right away with an "Added" mark. ### On your side The appended item shows up on your [Orders](https://dzbuild.com/docs/selling/orders.md) page with a **Cross-sell** chip on the order detail and order edit screens — and in [Advanced Order Management](https://dzbuild.com/docs/addons/advanced-orders.md) if you use it — so you can tell at a glance which lines the customer added themselves. Your order total is recalculated automatically from all its items, keeping the same shipping fee and any discount already applied. warning Confirm the added item by phone like the rest of the order. The customer added it on their own from the confirmation page, so it will not have been discussed during your usual call script unless you raise it. ## FAQ **Does adding a product create a second order?** No. The product is appended as a new line on the order that was just placed, and the order total is recalculated. The customer keeps one order, one delivery and one shipping fee. **How long can a customer keep adding products?** Additions are accepted for up to **2 hours** after the order was placed, and only while the order is still open — an order already set to delivered, cancelled or returned refuses new additions. **What if I never set any related products?** With **Auto-relate** on, the popup still works: it suggests products from the same category as what was ordered, then falls back to your best sellers. With it off, no suggestions are shown for that product. **Does it show on landing pages too?** No. The popup runs on the store's order-confirmation page after a storefront checkout. Orders placed through [landing pages](https://dzbuild.com/docs/selling/landing-pages.md) have their own confirmation flow and do not show it. **Can the popup break my checkout?** No. The add-on is fail-safe by design: if anything goes wrong it simply renders nothing. The order itself and the confirmation page are never blocked. --- Source: https://dzbuild.com/docs/addons/custom-delivery-label.md # Custom Delivery Label **Category:** Delivery  ·  **Min plan:** Pro  ·  **Slug:** `custom-delivery-label`  ·  **Not available on the Digital theme** Customize how product names appear on delivery labels — add/remove variants, quantity, and custom text per product. ## Video tutorial [Custom Delivery Label](https://www.youtube-nocookie.com/embed/UsDuWlYObUw) ## Features * Per-product delivery label customization * Toggle variant display on/off * Toggle quantity display on/off * Custom name and custom text per product * Live preview before save ## Why use it Couriers print whatever you put in the *product name* field on the shipping label. By default DZBuild composes each line as `{Qty}x {Product Name} ({Option} + {Option})` — quantity first, no dash, options in parentheses joined by `+`, and per-piece groups separated by `|`. For example: `2x T-shirt (Red + L)`. That works most of the time, but: * For some products you want the variant hidden (e.g. internal SKU codes) — couriers and customers don't need to see them. * For others you want the quantity hidden (so the courier doesn't open the package). * For sensitive items you want a generic label like *"Parfum"* instead of the actual product name. This add-on lets you override the label per product without touching the actual product name. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Custom Delivery Label** under *Delivery*. 3. Click **Activate** (Pro plan required). The add-on cannot be activated on the **Digital** theme; if you switch to Digital, the card is shown as paused and your label templates are preserved. 4. No sidebar entry is added — open the page from the **Settings** button on the add-on card, which links to `/dashboard/addons/delivery-label`. ## Configuring labels Open `/dashboard/addons/delivery-label`. It lists every **active** product sorted by name, including active products you have hidden from the storefront. There is no search box, and draft products are not listed. Scroll to the product and open its label editor: 1. Toggle **Show variant** on/off. 2. Toggle **Show quantity** on/off. 3. Optionally enter a **Custom name** — this replaces the product name on the label. Use it for a generic *"Parfum"*. 4. Optionally enter **Custom text** — an extra string placed around the name, with a **position** selector for *after* (default) or *before*. 5. The **Live preview** panel updates as you type. It uses a sample quantity (`2x`) and sample options, so it shows the layout of the line rather than the exact text of a real order. 6. Save. Both text fields are stripped of HTML and capped at 255 characters. To revert a product to the default label, use the trash button on its card. The change applies to all future shipments. Already-printed labels are not retroactively edited. ## What happens to products without a template The add-on is per-product and fails safe: * A product with no template keeps the default line, even inside an order that also contains customised products. * If nothing in the order has a template, the platform default applies to the whole order. * If anything goes wrong while building the custom list, the platform silently falls back to the default. Courier field length limits Each courier caps the product field, 100 to 255 characters depending on the courier. Long custom names or custom text on a multi-item order can push past that cap. When it does, the platform first drops the variant details from every line, then trims to the first few items with a `+N` suffix, and only as a last resort shortens the first item's name and adds `+N` for any other items. ## Tips * Use **Custom name** and **Custom text** sparingly — couriers cross-reference with the order, so a fully fake label can confuse them. * For products where customers should see the variant (e.g. *"T-shirt — Red, Size L"*), leave variant ON. * For multi-piece offers, hide quantity to avoid couriers opening the box. The actual quantity is still in the order details. * Pairs well with [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) when you want both the price and the label decoupled from the storefront. --- Source: https://dzbuild.com/docs/addons/custom-product-shipping.md # Custom Product Shipping **Category:** Shipping  ·  **Min plan:** Pro  ·  **Slug:** `custom-product-shipping` Set custom shipping prices per product — flat rate, per-wilaya pricing, or free shipping for specific products. ## Video tutorial [Custom Product Shipping](https://www.youtube-nocookie.com/embed/wFakpRH0hFg) ## Features * Per-product shipping prices * Free shipping per product * Flat rate or per-wilaya pricing * Highest-price-wins for mixed carts * Copy from store rates ## Why use it DZBuild's default shipping rates are set at the **store level** in [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). That's perfect when all your products ship the same way. It breaks down when: * One bulky product costs much more to ship (a 30 kg appliance vs. a 200 g phone case). * One product is offered with **free shipping** as a campaign (and you don't want to make all products free). * A specific product needs different per-wilaya rates than the rest of your catalog. This add-on lets you override shipping per product in three ways: flat rate, per-wilaya, or free. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Custom Product Shipping** under *Shipping*. 3. Click **Activate** (Pro plan required). The add-on cannot be activated on the **Digital** theme. 4. No sidebar entry is added — open the page from the **Settings** button on the add-on card, which links to `/dashboard/addons/custom-shipping`. ## Configuring per-product shipping Open `/dashboard/addons/custom-shipping`. It lists every **active** product, hidden ones included: hiding a product leaves its status active, so it stays in the picker. Draft products are the ones that do not appear and cannot be given an override. 1. Pick a product. A product with no override automatically follows your store rates. 2. Choose one of three modes (**Flat** is preselected when you open a product): * **Flat** — single price applied to every wilaya for this product. * **Per-wilaya** — a row per wilaya, each with its own price and a desk price. * **Free** — shipping is 0 DZD, regardless of wilaya. 3. Use **Copy from store rates** to seed the per-wilaya table from your global rates, then tweak. 4. Save. To send a product back to store rates, use the remove (trash) button on its card — there is no "use store rates" mode to pick. The per-wilaya table has 58 rows, or 69 if your store is set to 69-wilaya mode in Shipping settings. Empty prices use your store rate If you leave a desk price empty, a desk (stop-desk) order for that product is charged your normal store desk rate for that wilaya, or a higher override from another product in the cart. An empty home price works the same way. Wilayas you leave empty in the per-wilaya table also stay on your store rates. Fill in a price only where this product should cost something different. **Copy from store rates** only seeds the form at the moment you click it. Later changes to your store rates do not propagate to products that already have an override. ## Mixed carts (highest-price-wins) When a customer's cart contains products with different shipping rules, the **highest-price-wins** rule applies: * Cart has Product A (free shipping) + Product B (flat 600 DZD): cart shipping = 600 DZD. * Cart has Product A (flat 800 DZD) + Product B (flat 600 DZD): cart shipping = 800 DZD. * Cart has Product A (per-wilaya, Algiers = 500) + Product B (free): cart shipping = 500 DZD for an Algiers customer. * Cart has Product A (flat 600 DZD) + Product B with **no override**: the customer pays whichever is higher, the best custom rate or your normal store rate for that wilaya. Shipping is 0 only when every product in the cart has an override and every one of them is marked **Free**. Store-level free shipping always wins: while it is on in your Shipping settings, this add-on stands down entirely. This prevents shipping abuse where a customer adds a free-shipping item to bypass shipping fees. ## The weight surcharge When every product in the order has an override for the chosen delivery type (a price, or **Free**), the order is charged the highest of those overrides and the weight surcharge is not added. In a cart that also holds a product on store rates, or an override with no price for that delivery type, the customer pays whichever is higher: the override, or the store rate plus the weight surcharge, which counts the weight of every item in the cart. To keep a heavy item from raising that surcharge, clear its weight field. The shipping estimate on the storefront can still show the surcharge on top of an override, so check the amount on a finished test order. ## Turning the add-on off Deactivating instantly returns every product to your store rates, but the overrides themselves are kept — re-activating restores them exactly as they were. ## Tips * **Place a test order after configuring overrides.** Check that the shipping estimate shown on the storefront matches the amount the finished order is actually charged — they can disagree. * Use **Free shipping** sparingly as a marketing lever — heavily-discounted products with free shipping convert well, but if everything is free, the value signal disappears. * For per-wilaya, copy from store rates first, then bump only the wilayas where this product really costs more (e.g. southern wilayas for heavy items). * Combine with [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) so a free-shipping campaign doesn't get hammered by repeat orders from the same IP. --- Source: https://dzbuild.com/docs/addons/digital-product.md # Digital Product Variants **Category:** Storefront  ·  **Min plan:** Pro  ·  **Slug:** `digital-product`  ·  **Theme:** `digital` only Transforms the variant selector on Digital theme product pages into a sleek 2-step accordion UI. Shows final price on each option. One option highlighted at a time across all variant groups. ## Features * 2-step accordion variant selector * Final price shown per option (base + adjustment) * One option highlighted at a time across all variant groups. An option picked earlier in another group is not removed from the order: it stays in the cart with its price adjustment, unless no combination in stock pairs it with the new pick. * Smooth CSS animations matching Digital theme * Keyboard accessible (Enter/Space to select) * Zero product setup needed ## Why use it The default storefront variant picker is fine for fashion-style stores, but on the **Digital** theme, which is built for digital goods and services, the accordion layout reads more like a configurator than a form. Customers see the final price update on each option as they pick. ## How to activate 1. Make sure your store uses the **Digital** theme ([`/dashboard/themes`](https://dzbuild.com/dashboard/themes)). The add-on is theme-locked. Digital is the theme for digital goods only: switching to it puts the whole store in digital mode and pauses the add-ons made for physical products, so do not switch a store that ships parcels just for this accordion (see [Storefront themes overview](https://dzbuild.com/docs/storefront/themes-overview.md)). 2. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 3. Find **Digital Product Variants** under *Storefront*. 4. Click **Activate** (Pro plan required). There is nothing to configure on the products themselves — your existing variant groups and options render in the accordion automatically. Activation does not currently control this add-on This is a known defect. The accordion renders on **every** Digital-theme product page that has variants, whether or not the add-on was activated — and deactivating it does not remove it. Until the activation gate is added, treat the accordion as the Digital theme's variant picker rather than something you switch on. ## What it looks like * Each variant group becomes an accordion section. Only the first group opens automatically when the page loads. * Tapping a group expands it. The customer picks one option and the section collapses — nothing else opens, so the customer taps the next group's header themselves. * Each option's row shows: a colour dot (colour groups only), the option name, and the **final price** = base product price + option `price_adjustment`. The accordion never renders option thumbnails. * Options that are out of stock stay visible with a sold-out label, but cannot be selected or keyboard-focused. * Options disabled on the product are not shown at all, and a group whose options are all disabled is skipped entirely. * The duplicate variant dropdowns and swatches in the Digital theme's sidebar purchase card are hidden while the accordion is active. Quantity, price and the buy button stay where they are. ## Validation behaviour The **Add to cart** button, the buy-now button and the order form's submit button are always clickable. When one is clicked, the add-on only checks that **at least one option has been picked anywhere**; the per-group *Required* flags are bypassed. If nothing is selected, the selector is highlighted in red, the first unselected group opens and the page scrolls to it. ## Interaction with Cascading Variants On a product that uses [Cascading Variants](https://dzbuild.com/docs/addons/cascading-variants.md), the cascading child groups are left out of the accordion, and because the accordion hides the standard picker, customers cannot see or pick them. Avoid cascading groups on Digital-theme products. If every group on the product is a cascading child, the accordion does not render at all and the standard picker stays. ## Tips * Set `price_adjustment` correctly — it is the **delta** from the base price, not the absolute price. The pill shows base + adjustment. ## Theme requirement This add-on only renders on the Digital theme. If you switch to `bloom`, `brico`, `prestige`, `promobi`, `showcase` or `starter`, the storefront falls back to the default variant picker until you re-enable Digital. --- Source: https://dzbuild.com/docs/addons/ecomanager.md # Ecomanager integration: send your orders to Ecomanager **Category:** External platforms  ·  **Min plan:** Pro  ·  **Page:** `/dashboard/addons/ecomanager` **Ecomanager** is an e-commerce platform for managing orders and deliveries, where each shop has its own address of the form `https://your-store.ecomanager.dz`. If your team confirms and ships orders from Ecomanager, this integration puts your DZBuild orders into your Ecomanager shop without retyping them, and brings the Ecomanager state of each order back onto the matching DZBuild order. ## What the integration does * **Sends new orders.** Orders placed on your storefront and on your [landing pages](https://dzbuild.com/docs/selling/landing-pages.md) go to Ecomanager in the background while **Sync new orders** is on. They arrive in Ecomanager in the **En confirmation** state. * **Lets you send the others by hand.** Any other order, for example one you create on the [Orders](https://dzbuild.com/docs/selling/orders.md) page or one placed before you connected, waits on the integration page until you send it. * **Brings states back.** Once you register the webhooks, each state change in Ecomanager updates the status of the DZBuild order, and a tracking number given by Ecomanager is copied onto the order. * **Skips orders already sent.** An order that already carries an Ecomanager reference is not sent again. Status changes travel one way only. DZBuild does not send status changes to Ecomanager, so an order you confirm or cancel in DZBuild keeps its previous state in Ecomanager. Make those changes in Ecomanager and let them come back. ## What Ecomanager receives Each order arrives in Ecomanager with: * the buyer's name, phone number, wilaya, commune and address, plus the email and the note when the buyer gave them; * every product line with its SKU, quantity and unit price; * the shipping cost, the discount, and whether it is a home or a stop desk delivery. The phone number is sent in the local format starting with 0, so a number written with `+213` is rewritten. The commune is sent under its French name, to match the commune list in Ecomanager. Before sending, DZBuild looks for each product in your Ecomanager shop, first by SKU, then by name. A product it cannot find is created in Ecomanager with its name, SKU and price. If the product has no SKU in DZBuild, it receives the SKU it carries in Ecomanager; when DZBuild has to make one up, it starts with `DZBUILD-`. DZBuild sends one SKU per product, so two variants of the same product arrive under the same SKU. ## Order states that come back Ecomanager states reach DZBuild in two ways: through the webhooks once you register them, and when you press the refresh button on a sent order. Each state replaces the status of the DZBuild order: | Ecomanager state | Your DZBuild order becomes | | -------------------- | -------------------------- | | En confirmation | Pending | | En préparation | Confirmed | | En dispatch | Processing | | En livraison | Shipped | | Livrée, Encaissée | Delivered | | En retour, Retournée | Returned | | Annulée | Cancelled | Stock follows the new status by the same rule as when you change it yourself (see [Orders](https://dzbuild.com/docs/selling/orders.md)). A change that arrives by webhook also updates the order's row in [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md) when your store uses it, and sends you the same order status update alert as a change you make yourself (see [Notifications](https://dzbuild.com/docs/operations/notifications.md)). With the webhooks registered, deleting an order in Ecomanager does not delete it in DZBuild: the order loses its Ecomanager reference and goes back to the list of orders waiting to be sent, unless it is cancelled. ## What it costs The integration has no price of its own on DZBuild, and nothing is charged per order sent. The card lets you connect on the Pro, Unlimited and Enterprise plans. On the Free plan it shows a **PRO** badge and an **Upgrade to Pro** button that opens [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). Your Ecomanager subscription is billed by Ecomanager. ## How to connect 1. In Ecomanager, log in to your account, open **Shop Configuration** and copy the **API Token**. 2. In DZBuild, open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons), find the **Ecomanager** card in the **External platforms** section and click **Connect Ecomanager**. 3. In **Your Ecomanager store URL**, type only your shop's slug, without `https://` and without `.ecomanager.dz`. For `https://my-shop.ecomanager.dz`, type `my-shop`. The full address appears under the field as you type. 4. Paste the token into **API key**. 5. Click **Test and connect**. DZBuild checks the slug and the token against your Ecomanager shop and saves the connection only if the check passes. **Test connection only** runs the same check without saving anything. 6. When the page reloads with the **Connected** badge, press **Register Webhooks** so that Ecomanager states come back to DZBuild. **Sync new orders** is on from the first connection, so your next storefront order goes to Ecomanager with no other step. ## Using the integration page ### Counters Four tiles sit at the top: **Total orders**, **Orders sent**, **Waiting for sync** and **Last sync**. **Waiting for sync** counts every order without an Ecomanager reference, cancelled ones included, while the list below leaves cancelled orders out. ### Orders waiting to be sent This list shows your 20 most recent orders that carry no Ecomanager reference, cancelled orders excepted, with the order number, the buyer, the amount and the status. Each row has its own send button. **Send all** sends the orders you ticked, or every order in the list when none is ticked, after you confirm. One press sends up to 20 orders; the page then reloads and older orders take their place. If a group send fails, send the orders one by one with the button on each row. The message tells you what Ecomanager refused, for example a product it could not create. ### Sent orders This list shows the 20 most recently updated sent orders, with the order number, the **Eco ref** (the Ecomanager reference), the buyer and the DZBuild status. The **Refresh status** button on a row reads the order's current state in Ecomanager, then updates the status and the tracking number of the DZBuild order. ### Sync settings **Sync new orders** turns automatic sending on or off. Press **Save** after changing it. The **Order status updates** row below it is not a switch: it reads "Automatic updates via Webhooks", because states come back through the webhooks. ### Webhooks **Register Webhooks** creates four webhooks in your Ecomanager account: one for status changes, one for shipping status changes, one for confirmation status changes and one for deleted orders. Their names in Ecomanager start with `DZBuild -`. Once they are registered, the card shows **Registered** and the button becomes **Re-register**. ### Connection details This card lists your shop URL, the last six characters of the API token and the status **Active**. **Disconnect** asks for a confirmation, then stops sending orders and receiving states; orders already sent stay in Ecomanager. When you connect again, **Sync new orders** is back on and you need to press **Register Webhooks** again, because the webhooks from the earlier connection are no longer accepted. ## When something goes wrong The page shows the reason in a message. The most common ones: * The link must be in the form `https://slug.ecomanager.dz`: the store URL field holds more than the slug, for example the full address. Type only the slug, made of Latin letters, digits and hyphens. * The API key is invalid or expired: copy the token again from **Shop Configuration** and reconnect. * Too many requests: Ecomanager is limiting calls for a moment, so wait a little and try again. * Ecomanager server error: Ecomanager did not answer correctly, so try again later. * A product could not be created: the message names the product and gives the reason Ecomanager returned. If Ecomanager reports that your account is suspended, for example after an expired subscription or unpaid bills, DZBuild disconnects the integration on its own. Once your Ecomanager account is active again, connect it again and register the webhooks. Orders that could not be sent stay in **Orders waiting to be sent**, ready to send. ## FAQ **Do I have to send each order myself?** No. With **Sync new orders** on, orders from your storefront and your landing pages go to Ecomanager on their own. Use the waiting list for older orders and for orders created any other way. **Can an order reach Ecomanager twice?** DZBuild stores the Ecomanager reference of every order it sends and skips that order on later sends, so pressing **Send all** again does not copy it. **I changed an order's status in DZBuild. Why does Ecomanager still show the old state?** DZBuild does not send status changes to Ecomanager. Change the state in Ecomanager instead: with the webhooks registered, the new state comes back to DZBuild. **An order's status changed in DZBuild without me touching it. Why?** The order changed state in Ecomanager and a webhook applied it. Ecomanager states replace the DZBuild status, as shown in the table above. **Where do I find the API token?** In your Ecomanager account, on the **Shop Configuration** page, under **API Token**. **Can I connect Ecomanager on the Free plan?** No. The card needs the Pro, Unlimited or Enterprise plan. The other external platforms are listed in the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md), and [Flash Manager](https://dzbuild.com/docs/addons/flash-manager.md) connects on every plan. --- Source: https://dzbuild.com/docs/addons/facebook-catalog.md # Facebook Catalog **Category:** Marketing  ·  **Min plan:** Free  ·  **Slug:** `facebook-catalog` Auto-generate a Facebook/Instagram product feed (XML) for your store. Just copy the feed URL into Facebook Commerce Manager. ## Video tutorial [Facebook Catalog](https://www.youtube-nocookie.com/embed/rgylbE23l-8) ## Features * Auto XML feed * Facebook Commerce Manager * Instagram Shopping * Auto sync * Zero coding * Product images included ## What this add-on does This page covers the **add-on mechanics** — where the feed lives, what it contains, what settings it exposes. For how to actually *use* the feed in Meta Commerce Manager and run Dynamic Product Ads, see [Marketing → Facebook Catalog](https://dzbuild.com/docs/marketing/facebook-catalog.md). DZBuild generates a Facebook-compliant XML feed for your store. Every active, visible product in your catalog appears in the feed, with images, prices and stock status. You paste the feed URL into Meta Commerce Manager and Facebook re-fetches it automatically. ## There is nothing to activate Facebook Catalog is on for every store and cannot be turned off. Its card sits in the **Management Tools** section at the top of [`/dashboard/addons`](https://dzbuild.com/dashboard/addons), with a single **Manage catalog** button that opens `/dashboard/addons/facebook-catalog`. It never appears in the sidebar. ## The Facebook Catalog page `/dashboard/addons/facebook-catalog` shows: * your **feed URL**, with a copy button, * a **Preview** link that opens the XML, * a **Clear cache** button that clears the cached copy, * counts of products, images and categories, plus the last-sync time. Your feed URL depends on your domain The feed lives at `https:///feed/facebook.xml`, on your store's primary address. When your own domain is live and set as the primary address, the feed URL shown on this page moves to that domain: copy the new URL into Commerce Manager. While your free address is the primary one, the URL does not change. ## Settings The add-on exposes three settings: | Setting | Default | What it controls | | --------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Brand name** | Your store name | The `g:brand` field on every product in the feed. Empty falls back to store name. | | **Product condition** | `new` | A dropdown — `new`, `refurbished` or `used`. Anything else is coerced back to `new`. | | **Currency** | `DZD` | A 3-letter ISO code. Letters are uppercased when you save, and anything that is not 3 letters is set back to `DZD`. It only changes the currency label appended to the price; no conversion happens. | ## What's in the feed One item per product — variants are **not** exported and there is no `item_group_id`, so a product with variants appears once, at its base price. Each item carries: * `g:id`, `g:title`, `g:link` * `g:description` — the short description first; if empty, the long description with HTML stripped; if that is empty too, the product name. Truncated at 9,999 characters. * `g:price`, and `g:sale_price` when the product has a compare-at price higher than its current price (the original goes in `g:price`, the current in `g:sale_price`, so Facebook shows the discount) * `g:availability` — `in stock` or `out of stock` * `g:brand`, `g:condition` * `g:mpn` — from the product SKU, when set * `g:product_type` — from the product's primary category * `g:image_link` (cover image) and up to 10 `g:additional_image_link` entries Draft (non-active) and hidden products are excluded. **Out-of-stock products are included**, exported with availability `out of stock` — Facebook decides whether to show them. ## Facebook re-fetch The feed is cached on DZBuild for one hour. If you force a re-fetch in Commerce Manager inside that window, Facebook is served the cached copy and your change will not appear. To publish a change immediately: click **Clear cache** on `/dashboard/addons/facebook-catalog` to clear the cache, then re-fetch in Commerce Manager. ## Tips * Set **Brand name** to a real brand if you sell branded items — Facebook uses it for product matching across sellers. * The feed ignores query parameters — adding `?lang=ar` or `?lang=fr` returns exactly the same XML. * The add-on is free; running ads against the catalog is paid (your ad spend on Facebook). * See the marketing-side guide for [DPA setup, retargeting strategies and Instagram Shopping](https://dzbuild.com/docs/marketing/facebook-catalog.md). --- Source: https://dzbuild.com/docs/addons/flash-manager.md # Flash Manager Integration — Automatic Order Sync **Category:** External platforms  ·  **Min plan:** Free  ·  **Slug:** `flash-manager` **Flash Manager** (`flash-manager.com`) is a COD order-management and order-confirmation platform — its own tagline is *COD order management, WhatsApp confirmations & Meta ROAS*. Algerian merchants use it as a call-center workspace where a confirmation team calls or WhatsApps every new order, marks it confirmed or cancelled, and follows the delivery afterwards. DZBuild ships a **native integration** with it, so every order placed on your store lands in Flash Manager automatically, with no export and no copy-paste. ## Video tutorial [Flash Manager Integration — Automatic Order Sync](https://www.youtube-nocookie.com/embed/uOLAkJ-ik60) ## Features * **Order sync** — new DZBuild orders are sent to Flash Manager automatically. * **Confirmation center** — your team confirms orders in Flash Manager, including by WhatsApp. * **Delivery tracking** — Flash Manager's own delivery statuses are shown back inside DZBuild. * **Advanced reports** — Flash Manager's reporting on your order flow. * **Campaign ROAS tracking**: Flash Manager's Meta ROAS view of your orders. DZBuild passes the campaign id when the link the customer arrived on carries a `campaign_id`, `utm_campaign` or `campaignid` parameter. * **Advanced API** — the connection uses your own Flash Manager API key, stored encrypted. ## What it does Once your store is connected, DZBuild sends each **new order** to Flash Manager within seconds of it being placed. This covers orders from every selling surface: your storefront checkout, your [landing pages](https://dzbuild.com/docs/selling/landing-pages.md), orders you create manually from the [Orders](https://dzbuild.com/docs/selling/orders.md) page, and orders created through the DZBuild API. Nothing has to be clicked per order, and no CSV is involved. Once Flash Manager accepts an order, DZBuild records it as sent and skips it on every later attempt, so re-sending an order or pressing **Send unsynced orders** again does not create a second copy. The one case that can still slip through is two send attempts starting for the same order in the same instant; it is rare, but if you suspect it, look in Flash Manager for two orders carrying the same DZBuild order number. The **Recent orders** table on DZBuild lists each order once, so it cannot show the duplicate. In the other direction, DZBuild checks Flash Manager regularly and shows the confirmation and delivery status of each sent order inside the integration page: a delivered order shows up within about 5 minutes, other confirmation and delivery changes within about 30 minutes. Those statuses are only **copied onto your DZBuild orders** if you switch the mirror option on; it is off by default. ### Status mirroring When **Update order status from FlashManager** is enabled, Flash Manager's vocabulary is translated to DZBuild order statuses like this: | Flash Manager status | Your DZBuild order becomes | | -------------------------------------------------------- | -------------------------- | | New, Callback, No answer | Pending | | Confirmed, Confirmed by customer, Self-confirmation | Confirmed | | Cancelled, Duplicate, Wrong number | Cancelled | | Label created, Ready for pickup | Processing | | Picked up, Out for delivery, Attempted delivery, Delayed | Shipped | | Delivered | Delivered | | Failure | Returned | warning Two guards always apply, even with mirroring on. An order that has already been **sent to a delivery company** from DZBuild is never overwritten — its courier tracking stays the source of truth. And an order already in a final state (`delivered`, `returned`, `cancelled`) never walks backwards. ## Benefits * **No manual re-entry.** Your confirmation agents stop retyping names, phones, wilayas and totals into a second tool — the order is already there, complete. * **Faster confirmation.** Orders appear in the confirmation queue seconds after checkout, while the buyer still remembers ordering. Calling early is what keeps confirmation rates high. * **Fewer returns.** Wrong numbers, duplicates and undecided buyers get filtered *before* the parcel is handed to a courier, instead of coming back as a paid return. * **One place to look.** The integration page shows how many orders were sent, how many are still open, and what Flash Manager says about each one, next to your own store status. * **ROAS visibility.** Because every order reaches Flash Manager, its Meta ROAS reporting sees your full order volume, not a manually exported subset. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Scroll to the **External platforms** section and find the **FlashManager** card. 3. Click **Connect FlashManager** — it opens the management page at `/dashboard/addons/flash-manager`. 4. In Flash Manager, generate an API key carrying the `orders:write` permission and copy it. Their menus move from time to time, so look for the API section of their settings or ask Flash Manager support. DZBuild only accepts keys that start with `fm_`. 5. Paste it into the **API key** field and click **Connect**. The integration is **free on every DZBuild plan** — Free, Pro, Unlimited and Enterprise. There is nothing to buy on the DZBuild side. ## Using it ### Connection card * The header shows a **Connected** or **Not connected** badge. * Press **Test connection** to display your Flash Manager **account**, **plan**, and **orders used** out of your plan's monthly allowance. After **Connect** they show for a moment, then the page reloads without them. * Your API key is **stored encrypted and never rendered in the browser**. Once connected, the field only shows a masked hint like `fm_live_••••••••abcd`; typing a new key replaces the old one. * **Disconnect** removes the connection at any time. When you connect again, both settings go back to their defaults (**Send new orders automatically** on, **Update order status from FlashManager** off), so switch the mirror option back on and press **Save** if you used it. warning The key you generate must carry the `orders:write` permission. A key without it is refused at connect time with a clear message — generate a new key in Flash Manager with that permission enabled. ### Counters Four tiles summarise the sync — **Orders sent**, **In progress**, **Completed**, and **Not sent yet**. ### Settings * **Send new orders automatically** — on by default. This is what makes new orders flow without any action from you. * **Update order status from FlashManager** — off by default. Turn it on only if Flash Manager is your primary source of order statuses. Press **Save** to apply. ### Sending older orders If there are orders that were never sent, for example orders placed before you connected, a **Send unsynced orders** button appears. It asks for confirmation first, because those orders count against your Flash Manager plan's monthly order quota. Each press queues up to 200 of your most recent unsent orders, whatever their status (cancelled and delivered orders included), and sends them gradually in the background; once they are sent, press it again for older ones. ### Recent orders table The last sent orders are listed with **Order**, **Customer**, **Total**, **Store status**, **FlashManager number**, **FlashManager status**, and **Sent at**. Confirmed and delivered rows are highlighted in green, cancelled and failed ones in red. ### If something goes wrong When Flash Manager refuses a request, a **Last error** banner appears at the top of the page with the reason: monthly order limit reached on your Flash Manager plan, or missing permissions. If Flash Manager rejects the key itself, DZBuild disconnects the integration instead and the page shows **Not connected**: paste a valid key and click **Connect**. Once the cause is fixed, new orders flow again on their own; after a plan limit this can take up to an hour. Orders that failed in the meantime are not retried: they stay in **Not sent yet**, so press **Send unsynced orders** to send them. ## FAQ ### Does the Flash Manager integration cost anything on DZBuild? No. It is free on all DZBuild plans. You only pay Flash Manager for their own plan, and their plans carry a monthly order quota, whose size is set by Flash Manager and shown on their pricing page. That quota lives entirely on their side. All DZBuild sees is the moment you reach it: sending pauses and the **Last error** banner says the plan limit was reached. Orders placed while sending is paused are not sent later on their own: press **Send unsynced orders** once your quota is back. ### Can the same order be sent twice? Almost never. DZBuild remembers every order Flash Manager has accepted and ignores it on later send attempts, so re-sending or backfilling does not duplicate anything. A duplicate is only possible when two send attempts for the same order start at the same instant, before either of them has been recorded. If you do spot one, delete it in Flash Manager: the DZBuild side stays correct. ### Do I have to click anything for each new order? No. With **Send new orders automatically** on (the default), orders leave for Flash Manager within seconds of being placed: storefront, landing page, manually created, or created through the API. The **Send unsynced orders** button exists only for backfilling older orders. ### I already send orders to a courier from DZBuild. Will Flash Manager overwrite my statuses? Not unless you ask for it. **Update order status from FlashManager** is off by default, and even when enabled, orders already sent to a delivery company from DZBuild are never touched, so your courier tracking stays authoritative. ### Where do I find the other integrations? All add-ons and external platforms live on the same page — see the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md) and the **External platforms** section of [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). --- Source: https://dzbuild.com/docs/addons/image-cadre.md # Image Cadre & Crop **Category:** Products  ·  **Min plan:** Free  ·  **Slug:** `image-cadre` Adds a visual crop tool when uploading product images. Crop each photo to a fixed 1:1 square inside your browser, before anything is sent to DZBuild. ## Video tutorial [Image Cadre & Crop](https://www.youtube-nocookie.com/embed/xFkezkpKHPo) ## Features * Visual crop tool on product image upload * Fixed 1:1 square crop frame * Drag, zoom, and rotate in 90° steps * Cropping happens in the browser, before upload * Skip / Skip all buttons for quick uploads * Works on both create and edit pages ## Why use it Most DZBuild themes show product cards as squares. If you upload a 4:3 photo, the storefront centre-crops it and cuts off the top and bottom, usually exactly the part you wanted to show. This add-on lets you choose *which* square before the file is uploaded: drag, zoom, and rotate until the framing is right. No more re-uploading because the thumbnail looks wrong. Three themes are the exception. Bloom, Prestige and Promobi draw product cards slightly taller than they are wide, so a square crop is scaled up to fill the card and a thin strip is lost on the left and the right. Leave a bit of margin around the subject and the same crop reads correctly on every theme. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Image Cadre & Crop** under *Products*. 3. Click **Activate** (Free plan). 4. The settings panel exposes: * **Open cropper automatically** (on by default) — this is the on/off switch for the whole feature, not just its timing. With it **off** the crop modal never opens and there is no manual way to launch it: files upload uncropped. * **Output quality (75-100)** — WebP/JPEG encoder quality for the 1500×1500 output (default 90). ## Using the cropper After activating, every product image upload at [`/dashboard/products/create`](https://dzbuild.com/dashboard/products/create) and `/dashboard/products/{id}/edit` opens a modal with: * The image you just picked * A fixed **1:1 square** crop frame, the same one whatever theme your store runs * Drag to reposition * Pinch / scroll wheel to zoom, or the **Zoom in** / **Zoom out** buttons * **Rotate** — turns the image 90° counter-clockwise per click (fixed quarter-turns; you cannot straighten a slightly tilted photo) * **Reset** — back to the original framing * **قص وتأكيد** (*Crop & confirm*) to keep the cropped version * **تخطي** (*Skip*) to use the image as-is * **تخطي الكل** (*Skip all*) — appears only when more than one image is still queued note The cropper dialog currently renders in Arabic only, even when your dashboard language is French. Cropping happens entirely **in your browser, before the upload**. The cropped canvas replaces the picked file in the upload queue, so when you crop, only the cropped version is sent to DZBuild. A WebP crop is uploaded as is; a JPEG crop is converted to WebP on upload, like any other JPEG. Skipping an image uploads the original, which DZBuild handles like any other upload. ## Output format Cropped images are always re-encoded at **1500×1500 px**, as **WebP** where your browser supports it and **JPEG** otherwise. The uploaded filename's extension changes accordingly (`photo.png` becomes `photo.webp`). **Output quality** is the quality setting for that encoder. ## What it changes about the upload flow * The add-on takes over the product page's image picker (the upload area and the file input). * It still enforces the page's **maximum images per product** — when you are at the cap it shows an alert instead of queueing more files. * Each file still passes the page's normal validation; rejected files are listed in an alert and skipped. * If the crop tool cannot load — a blocked or very poor connection, for example — the add-on silently steps aside: no modal appears and the normal image picker keeps working. ## Tips * Set **Output quality** to 90 by default: file size drops with no visible quality loss. Push to 95-100 only for hero/cover images on premium-priced products. * The crop frame is a fixed 1:1 square and does not follow the theme, whatever the add-on card says about detecting a theme ratio. On Bloom, Prestige and Promobi the card is a little taller than a square, so keep the subject away from the left and right edges. * Shot came out sideways? Use the **Rotate** button — it saves you a round trip to your photo editor. It only does 90/180/270° turns, though. * Pairs naturally with the `image_text` variant type (small image + label) — the variant thumbnails inherit the cropped framing. --- Source: https://dzbuild.com/docs/addons/limit-orders-per-ip.md # Limit Orders Per IP **Category:** Security  ·  **Min plan:** Free  ·  **Slug:** `limit-orders-per-ip` Cap how many successful orders one IP address can place on your store within a chosen time window. Helps prevent flooding and fake orders. ## Video tutorial [Limit Orders Per IP](https://www.youtube-nocookie.com/embed/YLym8yVvnas) ## Features * Per-store IP rate limiting on orders * Configurable max orders and time window * Default: 3 orders per 12 hours * Counts only successful orders * Detects the customer's real IP address * Keeps enforcing the cap even during a partial platform outage ## Why use it Common abuse patterns on Algerian COD stores: * A competitor places 50 fake orders to waste your call-confirm staff's time. * A single household IP places repeat genuine orders, but you want to cap COD risk per address. * A scraper iterates through your catalog by submitting orders. This add-on enforces a hard cap: *"at most N successful orders from one IP within H hours"*. Excess attempts are rejected with an HTTP `429` and a message in your storefront's language telling the customer how long to wait (rendered in minutes, hours, or days — whichever reads best). The message deliberately never mentions IP addresses or anything technical. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Limit Orders Per IP** under *Security*. 3. Click **Activate** (Free plan). 4. The settings panel exposes: * **Max successful orders per IP** — default `3`, range 1-100. * **Time window in hours** — default `12`, range 1-720. Changing either setting immediately starts a fresh counter for every IP, so nobody inherits a wait time computed from your old configuration. That's deliberate: it means you can loosen the cap and unblock everyone instantly. Going back to a pair of values you used within the last window brings that pair's old counter back until it expires. ## Where the cap applies * The normal checkout page and fast-checkout on the product page. * Landing-page order forms (`/landing/...`). * It never applies to orders **you** create from the dashboard, so manual and phone orders are always accepted. ## How it counts * Only **successful** orders count toward the limit. An order refused at checkout (for example by your ban list) or an invalid one doesn't burn the IP's quota. Every order that is saved counts. * The window is **fixed, not rolling**. It starts when the IP's *first* counted order lands, and when it expires the counter resets to zero all at once — individual orders never age out one by one. With the default 3 / 12h: orders at 09:00, 11:00 and 13:00 fill the quota, the IP is blocked from 13:00 until 21:00 (12 hours after the 09:00 order), and from 21:00 the count is 0 again. * Detection targets the customer's real IP address rather than any intermediate network hop, so the limit applies to the actual buyer. * If a customer says their order did not go through, ask what the message said: a message asking them to try again after a set time comes from this limit. ## Failure modes * **Partial platform outage**: the limit keeps working. Counting continues transparently and the cap is still enforced. * **Total outage**: fails open — orders go through unchecked rather than being lost. This is rare, and it is the deliberate trade-off: a real order is never dropped because a check couldn't run. * **Shared IPs**: a shared corporate or carrier-grade NAT IP can hit the limit even with multiple distinct customers. If your traffic is heavily mobile-carrier-NAT (some Algerian ISPs), set the cap higher (e.g. 10 / 12h). ## Tips * Keep the **default 3 / 12h** for new stores running cold paid traffic — most customers don't legitimately reorder within the same day. * Combine with [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md) for layered defense — captcha catches headless browsers, this catches IP-bound spam. * Combine with [Advanced Order Management](https://dzbuild.com/docs/addons/advanced-orders.md) — orders rejected for IP-cap don't appear in the order list at all, which keeps your call-confirm queue clean. * For B2B stores where one buyer legitimately reorders many times per day, raise the cap to \~20. --- Source: https://dzbuild.com/docs/addons/min-max-quantity.md # Minimum and Maximum Order Quantity Per Product **Category:** Orders  ·  **Min plan:** Free  ·  **Slug:** `min-max-quantity` Set a **minimum and maximum order quantity per product**: how few and how many pieces of one product a single customer is allowed to order. Useful for wholesale sellers who only ship by the pack, and for anyone who wants to stop one buyer from clearing out a scarce product. Rules are set on a dedicated dashboard page and enforced when the order is submitted — on the storefront checkout, on fast checkout, and on landing pages. ## Video tutorial [Minimum and Maximum Order Quantity Per Product](https://www.youtube-nocookie.com/embed/ZpZXOLQRFVc) ## Features * Per-product min/max quantity rules * Searchable, paginated product list page in your dashboard * Inline save — no page reload * Set `0` to keep min/max unlimited per product * Promo offer bundles are exempt — merchant-set bundle qty is never blocked * Custom form submissions are not affected * Negligible impact on checkout speed * Never blocks a real customer if something goes wrong internally ## What it does Activating the add-on adds a page at `/dashboard/min-max-quantity` listing your products — 30 per page, newest first, archived products excluded. Each row carries two fields: a **Minimum** and a **Maximum** for that product. The values mean: | Value | Meaning | | ------------ | ------------------------------------------------------------- | | Minimum `0` | No minimum — the customer may order a single piece | | Minimum `3` | The customer must order at least 3 pieces of that product | | Maximum `0` | No maximum — unlimited | | Maximum `10` | The customer cannot order more than 10 pieces of that product | Both fields accept whole numbers from `0` to `10000`. A product with both fields at `0` has no rule at all, exactly like a product you never touched. ## How it works **On the storefront.** When a product carries a rule, its quantity picker is prepared for the customer: the quantity input starts at your minimum instead of `1`, and the plus/minus stepper and direct typing stay inside the minimum and maximum you set. If the product page already caps quantity to available stock and that cap is tighter than your maximum, the stock cap wins. **At order submit.** The real enforcement happens on the server the moment the order is sent. If the ordered quantity is below the minimum or above the maximum, the order is refused and the customer gets a clear message naming the product and the limit, written in your store's language (Arabic or French), for example *"Vous devez commander au moins 3 unité(s) de ..."* on a French store. **What is skipped on purpose:** * **Promo offer bundles.** When the customer takes an offer whose quantity and price you configured yourself (buy 2 for 3000 DA), the rule is not applied — your bundle quantity is never blocked by your own min/max. * **Custom forms.** A landing page custom form has no real product quantity, so nothing is checked. * **Products without a rule.** Anything left at `0`/`0` is never touched. warning After changing a minimum or a maximum, the new value can take up to **10 minutes** to appear on the public product page because of CDN caching. The protection on the server side applies **immediately** — an order that breaks the new rule is refused right away, even while the page still shows the old numbers. ## Benefits * **Sell by the pack.** Wholesale and semi-wholesale sellers can require a minimum of 3, 6 or 12 pieces per product instead of repeating it in the product description and hoping customers read it. * **Raise the average basket.** A minimum of 2 on a low-margin product makes every order worth the delivery and the confirmation call. * **Protect scarce stock.** A maximum stops one buyer (or one competitor) from taking your whole batch in a single order. * **Cap COD risk.** Large cash-on-delivery orders are the ones that hurt most when refused at the door. A per-product maximum keeps each order inside a size you are comfortable shipping. * **No product-by-product editing.** All the rules for your catalog live on one page, so you can review and change them in one pass instead of opening each product. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Minimum & Maximum Quantity Per Product** under *Orders*. 3. Click **Activate** — the add-on is available on the **Free** plan and on every plan above it. 4. A new sidebar entry for the add-on appears in your dashboard, pointing at `/dashboard/min-max-quantity`. If you open the page before activating, it shows a short notice and a link back to the Add-ons page instead of the product list. See [Add-ons overview](https://dzbuild.com/docs/addons/overview.md) for the full catalogue. ## Using it The page opens on four counters — **Total products**, **Products with rules**, **With minimum**, **With maximum** — so you can see at a glance how much of your catalogue is covered. Under them, the product table: * **Search** by product name or SKU with the search box at the top. * **Product** column shows the product image, its name and its SKU. * **Price** and **Stock** columns are read-only context, so you can decide the limits without opening the product. Products with stock tracking off show a dash instead of a number. * **Minimum** and **Maximum** are the editable number fields. Values outside `0`–`10000` are corrected as you type. * **Save** stays greyed out until you actually change something in that row. Click it and the rule is saved in place — the button reads *Saving…* then *Saved*, and the page never reloads. * Use **Previous** / **Next** at the bottom to move through the catalogue, or search instead of paging. tip A maximum must be greater than or equal to the minimum, or `0` for no limit. Saving a maximum below the minimum is refused with a message on the Save button — otherwise the product would become impossible to order at all. To remove a rule completely, set both **Minimum** and **Maximum** back to `0` and save. ## FAQ **What does `0` mean exactly?** `0` means "no limit on this side". Minimum `0` lets the customer order a single piece; maximum `0` means unlimited. Both at `0` = the product has no rule. **Will this block my promo offers and bundles?** No. When the customer buys through an offer you configured (a fixed bundle quantity and price), the min/max rule is deliberately skipped, so your own bundles are never rejected. **Does it apply to landing pages and fast checkout too?** Yes. The check runs when the order is submitted, so it covers the normal storefront checkout, fast checkout and [landing pages](https://dzbuild.com/docs/selling/landing-pages.md) alike. Orders refused this way never reach your [Orders](https://dzbuild.com/docs/selling/orders.md) page. **I changed the minimum but the product page still shows the old one.** That is the CDN cache — allow up to 10 minutes for the public page to refresh. Enforcement on submitted orders is already using the new value. --- Source: https://dzbuild.com/docs/addons/multi-language.md # Multi-Language Store **Category:** Storefront  ·  **Min plan:** Unlimited (Enterprise included)  ·  **Slug:** `multi-language` Serve your storefront in both Arabic and French, each on its own indexable URL, with a customer language selector. ## Video tutorial [Multi-Language Store](https://www.youtube-nocookie.com/embed/ODgyrMRXc-I) ## Features * Customer-facing language selector * Arabic & French * A separate URL per language, indexable by Google * `hreflang` + `x-default` SEO annotations emitted automatically * RTL/LTR auto-switching * Works across all live themes * No loss of CDN edge caching ## Supported languages Arabic and French — that is the complete set. There is no way to add English, Spanish, or any other language, so don't buy the Unlimited plan expecting one. The storefront chrome translations are provided and maintained by DZBuild, not by you: they are complete and consistent for both languages out of the box. ## What it does Once activated, every storefront page renders a small language selector with the languages you enabled. Each language has its **own URL**. Your store's primary language stays on the bare path, and the other language is served under a language prefix: ``` https://yourstore.com/ ← primary language https://yourstore.com/product/my-item https://yourstore.com/fr/ ← French version https://yourstore.com/fr/product/my-item ``` The selector navigates to that URL rather than re-rendering the page in place. When the customer lands on the Arabic version the entire layout flips to RTL automatically; the French version renders LTR. Because the language now lives in the URL, a returning visitor who bookmarks or re-opens `/fr/...` stays in French — while someone who re-enters your bare domain gets your primary language again. How a visitor's language is chosen The address decides the language. Your bare domain always opens in your primary language, and the prefixed address (`/fr/` on an Arabic store, `/ar/` on a French store) opens the other one. A visitor changes language with the selector, which takes them to the same page in the other language. **Auto-detect browser language** does not redirect visitors. On an Arabic store, a visitor whose browser prefers French still gets Arabic at the bare address until they use the selector or follow a `/fr/` link. ## SEO This is the strongest reason to activate the add-on. Each language is a real URL, so DZBuild emits `hreflang` alternates for every enabled language plus an `x-default` pointing at the bare path, on your home page, product pages, category pages and the product listing. The cart, checkout and landing pages don't carry hreflang alternates. Google indexes both versions separately, so a single store can rank for both Arabic and French queries on the same products. And because the language is in the path rather than in a cookie, multilingual pages keep full CDN edge caching — there is no speed penalty for turning this on. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Multi-Language Store** under *Storefront*. 3. Click **Activate** (Unlimited plan required). 4. The settings panel exposes three toggles: * **Enable French** (on by default) * **Enable Arabic** (on by default) * **Auto-detect browser language** (on by default; see the note above) Keep both language toggles on These two toggles *are* the complete language list. Because there are only two languages, switching **either** one off leaves a single language — which switches the whole add-on off: the selector disappears and the `/fr/` URLs stop resolving. Your store still serves its own primary language (that comes from your store setting, not from these toggles), but you lose the multi-language feature entirely. ## What gets translated The add-on translates the **storefront chrome** — navbar, cart, checkout strings, buttons, generic labels. **Product titles, descriptions and category names are not translatable today.** They render exactly as you typed them on both language URLs. There are no per-language product or category fields anywhere in the dashboard. ## Tips * Even if you only sell to Algerian buyers, Arabic-first and French-first shoppers are both large audiences, so a second language removes a reason to leave. Nothing in your dashboard reports orders by language, so if you want to know what the second language changed, compare your order count before and after. * Set the right primary language for your audience; the language selector is for the *minority* portion of your visitors. * Test the storefront in both languages after activation. Some custom CSS doesn't flip cleanly on RTL — a quick visual pass catches it. ## Compatibility * Works on all seven live themes: `starter`, `brico`, `digital`, `showcase` (shown as *Started V2*), `prestige`, `bloom`, `promobi`. * The selector's placement depends on viewport. The navbar switcher is hidden below 768 px — on mobile the language links appear in the slide-out sidebar instead. Pages without the standard navbar get a floating button in the bottom corner. * Compatible with the [Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md) and [Stop Desk](https://dzbuild.com/docs/addons/stop-desk.md) add-ons — their UI strings translate too. --- Source: https://dzbuild.com/docs/addons/offer-variant-popup.md # Offer Variant Popup **Category:** Storefront  ·  **Min plan:** Free  ·  **Slug:** `offer-variant-popup` Replaces the inline per-piece variant selector with a beautiful, responsive popup modal when customers select multi-quantity offers. Shows variant images, colors, and names in an easy-to-use interface. ## Features * Beautiful responsive popup modal * Shows variant images and colors * Per-piece variant selection for offers * Auto-scroll to the next unfinished piece * Cross-piece stock awareness ## What it does When a product has a **multi-quantity offer** (*"Buy 3, save 20%"*, *"Pack of 2"*, *"Buy 1 get 1 free"*), each piece can have its own variant selection — a customer buying 3 t-shirts may want 1 red, 1 blue, 1 black. By default, this is shown as inline pickers on the product page — clean for 2 pieces, cramped for 5. The add-on replaces those inline pickers with a responsive modal: * One section per piece in the offer, all of them in a single scrollable sheet. * When the customer finishes a piece, the modal smooth-scrolls to the next unfinished one. * Variant images render with the larger card layout — easier to tap on mobile. * The customer taps **تأكيد / Confirmer** (*Confirm*) when every piece is filled. That validates the picks, updates the displayed price and totals, and closes the modal. Confirming does **not** add anything to the cart. Adding to cart / submitting the order stays a separate action on the product page. After confirming, the product page shows a compact summary of each piece's picks (with colour dots). Tapping that summary reopens the modal with the previous selections preserved, so a customer can change one piece without redoing the rest. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Offer Variant Popup** under *Storefront*. 3. Click **Activate** (Free plan). 4. The settings panel exposes: * **Auto-advance to next piece** — on by default: after a piece is complete the modal scrolls to the next unfinished one. Turning it off does **not** add a Next button (there is no Next button) — the customer simply scrolls to the next piece themselves. * **Show variant images**: on by default. Turned off, no option shows a photo: colour options keep their colour swatch, image options without a colour show a plain tile, and text options stay text. Even with it on, an image only appears for variant options you have linked to one of the product's gallery images: colour options without a linked image render as a colour dot, and plain text options render as text. No product setup required beyond the offers and variants themselves. ## Where it applies * The product page, on all seven live themes — including `digital`. * Only for products that have **both** multi-quantity offers **and** variants. If either is missing, the add-on does nothing and the standard picker is used. * **Not** on landing pages (`/landing/...`) — those keep their inline per-piece pickers. ## Compatibility * Compatible with [Cascading Variants](https://dzbuild.com/docs/addons/cascading-variants.md) — child groups appear inside the modal once the parent is picked. The add-on also fixes add-to-cart validation for that combination: cascade-hidden child groups no longer count as unfilled, so customers stop hitting false "please select all options" errors. * Compatible with [Stock Management](https://dzbuild.com/docs/addons/stock-management.md) per-combination stock. It doesn't just hide globally sold-out combinations — it also accounts for what the *other* pieces of the same offer have already taken. A customer buying 3 of a variant with 2 in stock cannot pick it three times: the option greys out and is deselected. Options with no stock value set are treated as unlimited. * Compatible with the [Multi-Language](https://dzbuild.com/docs/addons/multi-language.md) add-on — popup labels translate. ## Tips * Leave **auto-advance** on for fashion (Color → Size flows fast). Turn it off when each piece has many groups (Brand → Model → Year) so the customer can review picks at their own pace before scrolling on. * The **Show variant images** toggle is most useful when your variants are visually distinct (colors, prints). It changes nothing for pure text variants like sizes: they always show as compact text buttons. * Pair with [Image Cadre & Crop](https://dzbuild.com/docs/addons/image-cadre.md) so the variant images in the popup are framed correctly. * For one-piece offers (no multi-quantity), the popup doesn't activate — the customer sees the standard inline picker. --- Source: https://dzbuild.com/docs/addons/overview.md # Add-ons catalog Add-ons extend DZBuild with features that are not part of the core platform. Most of them are opt-in, off by default, and non-destructive — uninstalling never touches your products, orders, or customers. Two exceptions are worth knowing up front: * **Facebook Catalog** is on for every store and cannot be deactivated. * **Digital Product Variants** currently renders on any Digital-theme product page that has variants, whether or not you activated it. That is a known defect, not intended behaviour. ## How to activate an add-on 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find the card for the add-on you want. 3. Check the badge on the card: **Available** means your plan already includes the add-on; a plan name (**PRO**, **UNLIMITED** or **ENTERPRISE**) means you need that plan first. 4. Click **Activate**. The card flips in place, without a page reload. Seven add-ons take you straight to their management page instead: **A/B Testing**, **Pickup from Store**, **Short Links & QR Codes**, **Webhooks**, **WhatsApp Sender**, **Claude** and **ChatGPT**. 5. Some add-ons add a dedicated dashboard page; for those, a new entry appears in the sidebar (e.g. **Stock management**, **Reviews**, **Advanced orders**). To turn an add-on off later, click **Deactivate** on the same card. The feature stops; the data the add-on collected stays in place in case you re-enable it. ## The add-on catalog There are 25 add-ons. The installable grid on `/dashboard/addons` shows 20 of them. Five are pulled out of the grid: **A/B Testing**, **Product Reviews** and **Facebook Catalog** render as Management Tools cards (see below), and **Claude** and **ChatGPT** sit in the External platforms section. | Add-on | Category | Min plan | What it does | | ---------------------------------------------------------------------------------------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [A/B Testing](https://dzbuild.com/docs/addons/ab-testing.md) | Marketing | Pro | Splits one test link between 2 to 5 landing pages, compares their orders and conversion, then sends everyone to the winner. Managed at `/dashboard/ab-tests` | | [Advanced Order Management](https://dzbuild.com/docs/addons/advanced-orders.md) | Orders | Unlimited | CRM-style order page with 12 sub-statuses + call attempt tracking | | [Advanced Analytics](https://dzbuild.com/docs/addons/advanced-analytics.md) | Marketing | Enterprise | Real-time visitor analytics — pageviews, sessions, top pages, referrers, devices. Self-hosted; no data sent to third parties | | [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md) | Security | Pro | ALTCHA Sentinel verification on every checkout form | | [Cascading Variants](https://dzbuild.com/docs/addons/cascading-variants.md) | Products | Pro | Dependent variant groups — Brand → Model | | [Cross-Sell — Frequently Bought Together](https://dzbuild.com/docs/addons/cross-sell.md) | Storefront | Pro | After an order is placed, shows a "frequently bought together" popup; the extra product is added to the same order. Managed at `/dashboard/cross-sell` | | [Custom Delivery Label](https://dzbuild.com/docs/addons/custom-delivery-label.md) | Delivery | Pro | Per-product control of how product names appear on courier labels | | [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) | Shipping | Pro | Per-product flat-rate, per-wilaya pricing or free shipping | | [Digital Product Variants](https://dzbuild.com/docs/addons/digital-product.md) | Storefront | Pro | 2-step accordion variant selector for the Digital theme | | [Facebook Catalog](https://dzbuild.com/docs/addons/facebook-catalog.md) | Marketing | Free | Auto-generated XML feed for Meta Commerce Manager | | [Image Cadre & Crop](https://dzbuild.com/docs/addons/image-cadre.md) | Products | Free | Visual crop tool with theme aspect-ratio overlay | | [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) | Security | Free | Rate-limit successful orders per IP address | | [Minimum & Maximum Quantity](https://dzbuild.com/docs/addons/min-max-quantity.md) | Orders | Free | Set per-product min/max order quantity rules, enforced at checkout | | [Multi-Language Store](https://dzbuild.com/docs/addons/multi-language.md) | Storefront | Unlimited | Customer-facing language selector on the storefront | | [Offer Variant Popup](https://dzbuild.com/docs/addons/offer-variant-popup.md) | Storefront | Free | Per-piece variant picker shown as a modal during multi-quantity offers | | [Pickup from Store](https://dzbuild.com/docs/addons/pickup-from-store.md) | Shipping | Unlimited | Adds a free pickup option at checkout for customers in the wilayas where you registered a pickup point. Managed at `/dashboard/pickup-points` | | [Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md) | Storefront | Free | Star ratings 1-5 with verified-purchase badges | | [Shopify Import](https://dzbuild.com/docs/addons/shopify-import.md) | Tools | Pro | Import products, variants, images and collections from Shopify in one click via OAuth | | [Short Links & QR Codes](https://dzbuild.com/docs/addons/short-links.md) | Marketing | Free | Branded short links for products, landing pages, categories and your homepage, with click tracking and a downloadable QR code. Managed at `/dashboard/short-links` | | [Advanced Stock Management](https://dzbuild.com/docs/addons/stock-management.md) | Inventory | Free | Full inventory dashboard with sold/returned tracking | | [Stop Desk Selector](https://dzbuild.com/docs/addons/stop-desk.md) | Storefront | Free | Structured desk picker (name + address + phone) at checkout | | [Webhooks — n8n / Make / Zapier](https://dzbuild.com/docs/addons/webhooks.md) | Tools | Unlimited | Sends a signed webhook to your automation tool the moment an order is created or changes status. Managed at `/dashboard/webhooks` | | [WhatsApp Sender](https://dzbuild.com/docs/addons/whatsapp-sender.md) | Orders | Pro | Sends your buyers a WhatsApp message when the order is received, confirmed, on the way, when the courier could not reach them and when it waits at the pickup desk; their replies land on the order page. Managed at `/dashboard/whatsapp-sender` | Only these add-ons put an entry in the dashboard sidebar when active: A/B Testing, Advanced Order Management, Advanced Analytics, Product Reviews, Advanced Stock Management, Minimum & Maximum Quantity, Short Links, Webhooks, Pickup from Store and WhatsApp Sender. Cross-Sell, Custom Delivery Label, Custom Product Shipping, Shopify Import and Facebook Catalog have a management page too, but no sidebar entry; open them from the **Settings** (or **Manage catalog**) button on their card. ## External platforms The same [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) page carries an **External platforms** section, right after Management Tools and above the installable add-ons, for services that run outside DZBuild and connect to your store. Flash Manager is not an add-on: you connect an account there instead of activating a card. The section also holds Octomatic and Ecomanager cards, which open their own connection pages (Ecomanager needs a paid plan). Claude and ChatGPT are real add-ons with an Activate button, listed in this section because they link your store to a service running outside DZBuild. | Integration | Category | Min plan | What it does | | ----------------------------------------------------------------- | ------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [Flash Manager](https://dzbuild.com/docs/addons/flash-manager.md) | External platforms | Free | Sends every new order to your Flash Manager confirmation team automatically, and brings their confirmation and delivery statuses back into DZBuild. Managed at `/dashboard/addons/flash-manager` | | [Ecomanager](https://dzbuild.com/docs/addons/ecomanager.md) | External platforms | Pro | Sends every new order to your Ecomanager shop and brings its order states back into DZBuild. Managed at `/dashboard/addons/ecomanager`. | | [Claude](https://dzbuild.com/docs/addons/claude.md) | External platforms | Enterprise | Connects the Claude assistant to your store so you can create products, generate landing pages, check orders and read your analytics by chatting. Managed at `/dashboard/addons/claude` | | [ChatGPT](https://dzbuild.com/docs/addons/chatgpt.md) | External platforms | Enterprise | Connects ChatGPT or Codex (by OpenAI) to your store so you can create products, generate landing pages, check orders and read your analytics by chatting. Managed at `/dashboard/addons/chatgpt` | Apps built by outside developers appear in the **Developer apps** section of the same page once you install one: see [Apps](https://dzbuild.com/docs/addons/apps.md). ## Built-in toggles Two features are built into the platform rather than shipped as installable add-ons. They are **off until you toggle them on**, from their cards in the Management Tools section at the top of [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) — they never appear in the installable grid: * **Promo codes** — discount codes, managed at [`/dashboard/promo-codes`](https://dzbuild.com/dashboard/promo-codes). * **Countdown urgency** — a countdown and a live-visitor counter on product pages. Countdown urgency is configured once for the whole store, from the **Settings** button on its card: show countdown, show live visitors, cycle duration in hours (1-24, default 8), minimum and maximum simulated visitor count (defaults 15 and 50), visitor text and countdown title. The settings then apply to product pages store-wide. Landing pages have their own, unrelated `countdown` and `fake_visitors` section types in the landing-page editor — those belong to the landing-page builder, not to this built-in. ### Video tutorial: Promo codes [Promo codes](https://www.youtube-nocookie.com/embed/RZDkm8Ntkw8) ### Video tutorial: Countdown urgency [Countdown urgency](https://www.youtube-nocookie.com/embed/hBCJwg6tRI0) ## Management Tools section **Management Tools** is the first section of the [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) page — not a sidebar group. It holds eight cards: Team, Google Sheets, Product Add-ons, Promo codes, Countdown urgency, A/B Testing, Product Reviews and Facebook Catalog. Of the three add-ons that live here instead of in the installable grid: * **A/B Testing** adds a sidebar entry when active → run your tests at [`/dashboard/ab-tests`](https://dzbuild.com/dashboard/ab-tests) * **Product Reviews** also adds a sidebar entry when active → moderate at [`/dashboard/reviews`](https://dzbuild.com/dashboard/reviews) * **Facebook Catalog** has no sidebar entry; open it from the **Manage catalog** button on its card → `/dashboard/addons/facebook-catalog` ## Plan requirements Each add-on declares a minimum plan. The card shows the plan name (**PRO**, **UNLIMITED** or **ENTERPRISE**) only while your plan is below it; once your plan covers the add-on, the badge reads **Available**. Three add-ons require Enterprise: Advanced Analytics, Claude and ChatGPT. If you are below the required plan, the **Activate** button is replaced by **Upgrade to Pro**, **Upgrade to Unlimited** or **Upgrade to Enterprise**, which links to [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). For most add-ons the plan is checked only at activation time. If you downgrade, add-ons you already activated keep running, but once you turn one off, you cannot re-activate it until you restore the plan. Advanced Analytics, Claude and ChatGPT are the exception: they stop working while your store is not on the Enterprise plan and work again once it is. ## Add-ons paused by your theme An add-on can declare themes it is incompatible with. On such a theme the card is shown as **paused**: the Activate button is disabled, the add-on does not run, and nothing is uninstalled — its settings and data are preserved and it resumes if you switch back to a compatible theme. Seven add-ons are unavailable on the **Digital** theme: * Advanced Order Management * Cross-Sell — Frequently Bought Together * Custom Delivery Label * Custom Product Shipping * Pickup from Store * Advanced Stock Management * Stop Desk Selector Text typed into add-on settings is stored HTML-escaped In the generic Settings modal on an add-on card, the characters `<`, `>`, `&`, `"` and `'` are escaped before being saved, so they can render literally later. Avoid them in those fields. Add-ons with their own dedicated page (for example Custom Delivery Label) strip HTML instead. ## Removing add-on data Deactivation is reversible. If you also want the data an add-on collected erased for good, contact support. There is no self-serve hard-uninstall. --- Source: https://dzbuild.com/docs/addons/pickup-from-store.md # Pickup from Store **Category:** Shipping  ·  **Min plan:** Unlimited and above  ·  **Slug:** `pickup-from-store`  ·  **Not available on the Digital theme** **Pickup from Store** lets your customers collect their orders directly from your own shop — free of delivery charges. Add your pickup points (wilaya, commune, address) and a third delivery option appears at checkout, on the product page and on landing pages for customers in those wilayas. It is built for Algerian merchants who already have a physical shop, depot or office and want nearby buyers to skip the courier entirely. ## Video tutorial [Pickup from Store](https://www.youtube-nocookie.com/embed/Pr6Fx8Xikcg) ## Features * Third delivery option at checkout: home, desk, or pickup from store * Multiple pickup points, each with its wilaya, commune, address and phone * Pickup is free — no shipping cost for the customer * Shown only to customers in wilayas where you have a pickup point * Works on the product page, classic checkout and landing pages * Pickup orders are clearly marked and never sent to delivery companies ## What it does The add-on adds a third choice next to **Home delivery** and **Desk delivery** on your buying surfaces. You list your own addresses on **Dashboard → Pickup points** at [`/dashboard/pickup-points`](https://dzbuild.com/dashboard/pickup-points); a customer who selects a wilaya where you have at least one **active** point sees a **Pickup from store** option priced as **Free**. Choosing it swaps the delivery address fields for a dropdown of your points in that wilaya. Once the customer picks one, a small card shows the point's name, full address and phone, so they know exactly where to go and who to call. Availability is evaluated per **wilaya**. If you have no active point in the customer's wilaya, the option is not rendered at all — the customer simply sees home and desk delivery as before. Switching a point off hides it from the storefront without deleting it. Two things are decided on DZBuild's side, not by the page: * **Shipping on a pickup order is always 0**, whatever the page sends. * **The chosen point is re-checked when the order is submitted.** It must belong to your store, be active, and sit in the wilaya the customer selected. Anything else is refused instead of becoming an order. ## Benefits * **You keep the delivery fee out of the equation.** A free option next to a paid one is a strong argument for buyers who live near your shop. * **No courier, no failed delivery, no return** on local orders — the customer comes to you and pays on the spot. * **Your physical shop becomes part of your online funnel** instead of a separate business. * **Zero courier cost** on those orders, which matters most on low-margin products where delivery eats the profit. * **No confusion for your team**: pickup orders are labelled as such in your orders list and are blocked from courier sending, so nobody dispatches an order the customer is coming to collect. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Pickup from Store** under *Shipping*. 3. Click **Activate**. The add-on requires the **Unlimited** plan (or higher) — on Free and Pro the card stays locked. 4. You land straight on the **Pickup points** page, and a **Pickup points** entry appears in the dashboard sidebar. 5. Add your first point — until you do, nothing changes on your storefront. Paused on the `digital` theme Stores running the `digital` theme sell products with no physical shipping, so the add-on cannot be activated there — the card shows a paused state. Nothing is uninstalled; switching back to a physical-goods theme restores it. ## Using it ### Adding a pickup point On **Dashboard → Pickup points**, fill the form: | Field | Required | Notes | | ------------ | -------- | ---------------------------------------------------------- | | Point name | Yes | At least 2 characters, e.g. *Main shop — Bab Ezzouar* | | Wilaya | Yes | The wilaya the option will be offered in | | Commune | No | Must belong to the selected wilaya | | Full address | Yes | At least 5 characters — the address the customer will read | | Phone | No | Shown to the customer next to the address | Save, and the point goes live as **active**. Your points are listed grouped by wilaya, and each row can be **edited**, **switched off** or **deleted**. A store can hold up to **100** pickup points. A change takes effect on the next page load; storefront pages are cached for a few minutes, so a visitor who already had checkout open can see the old list for up to about five minutes. Name the point the way a customer would find it The name and address are what the buyer reads at checkout, so write them as directions, not as internal labels. *Main shop — Bab Ezzouar, next to the post office* beats *Depot 2*. ### What the customer sees 1. The customer selects their **wilaya** first — the pickup dropdown stays disabled until then. 2. If you have an active point in that wilaya, the **Pickup from store** option appears with a **Free** price. 3. Selecting it reveals the point dropdown; picking a point shows its name, address and phone below. 4. The order cannot be submitted with pickup selected and no point chosen — the form asks for one. 5. Changing the wilaya resets the choice, and fresh points are loaded for the new wilaya. The option appears on all three buying surfaces: the classic checkout page, fast checkout on the product page (all five fast-checkout styles), and [landing-page](https://dzbuild.com/docs/selling/landing-pages.md) order forms. ### Pickup orders in your dashboard * The delivery type reads **Pickup from store** on the order detail and order edit pages, and on the confirmation page your customer sees after ordering. * The [orders list](https://dzbuild.com/docs/selling/orders.md) delivery-type filter includes **Pickup from store**, so you can pull up everyone coming to collect today. * **Send to delivery is refused** for these orders — one by one, with a message explaining the order is collected in store, and in bulk, where pickup orders are skipped and reported as skipped. ## FAQ ### Does pickup cost the customer anything? No. Shipping on a pickup order is set to zero on DZBuild's side, so the customer pays the product price only — regardless of your home or desk delivery rates. ### What if I have no pickup point in the customer's wilaya? The option is not shown to them at all. They see home and desk delivery exactly as before, so adding a point in one wilaya never affects the rest of the country. ### Can I close a pickup point temporarily? Yes, switch it off instead of deleting it. It stops being offered on pages loaded after the change, and keeps its address, phone and history for when you switch it back on. A point that is off is also refused if an order still tries to use it. ### What happens to my points if I deactivate the add-on? They are kept. Deactivating only removes the option from your storefront; reactivating the add-on brings your list back as it was. ### Can a customer pick a point in a different wilaya? No. Only the points of the wilaya they selected are offered, and the order is re-checked when submitted — a point from another wilaya, another store or a switched-off point is refused. ## Compatibility * Not available while your store runs the `digital` theme. * Different from [Stop Desk Selector](https://dzbuild.com/docs/addons/stop-desk.md): stop desk selects one of the **courier's** desks, this add-on selects one of **your own** locations. * See the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md) for the full list of add-ons and their plan requirements. --- Source: https://dzbuild.com/docs/addons/product-addons.md # Product Add-ons for print and personalized products **Category:** Products  ·  **Min plan:** Pro  ·  **Section:** Management Tools **Product Add-ons** puts fields on a product page that the buyer fills in before ordering: a short text for the name to print, a long text for a gift message, or an image upload for the photo to print. A field can carry an extra price in DA, and every answer, the image included, reaches you on the order page. A print shop or a personalized gift seller gets the whole order in one step instead of calling the buyer back to ask for the photo. ## Video tutorial [Product Add-ons for print and personalized products](https://www.youtube-nocookie.com/embed/78tj1zrwClo) ## What you can ask the buyer Each product has its own list of fields, and each field is one of three types: | Field type | What the buyer gets | Settings | | ------------------------------ | ------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | **Short text (one line)** | A one-line box, for example for the name to print on a mug | Placeholder text, maximum characters, extra price, required | | **Long text (multiple lines)** | A three-line box, for example for a gift card message | Placeholder text, maximum characters, extra price, required | | **Image upload** | An upload area; the buyer picks a photo and sees a preview with a button to remove it | Extra price, required | * **Placeholder text (optional)** shows inside the empty box as a hint, for example "Write the name to print". * **Maximum characters** stops the box at that length. Leave it empty for no limit. * **Extra price (optional)** in DA is shown next to the field title on the product page, for example +200 DA. * **Required field** adds a star to the title, and the buyer cannot order until the field is filled. The image upload takes JPG, PNG, GIF and WEBP files up to 5 MB. The file is stored as the buyer sent it, with no compression or format change, so what you print is the original. ## How to set it up 1. Open **Dashboard → Add-ons**. In the **Management Tools** section, click **Manage add-ons** on the **Product Add-ons** card. 2. The page lists your active products. Each card shows the number of fields and a badge, **Enabled** or **Disabled**. 3. On the product you want, click **Manage add-ons**, then **Add a new field**. 4. Type the **Field title**, which is the question the buyer reads, pick the **Field type**, set the options you need and click **Save**. 5. Back on the product card, click the switch button next to **Manage add-ons**. The badge changes to **Enabled** and the fields appear on your store. Every product starts with its fields switched off, so the buyer sees nothing until you switch the product on. You can prepare the fields first, and the same switch hides them again without deleting anything. In a product's list of fields, drag the handle at the start of a row to change the order; the product page shows the fields in that order. The pencil button edits a field and the bin button deletes it after a confirmation. ## What the buyer sees On the product page, the fields sit in a block titled **Customization options**, each with its title, a star when it is required and its extra price. The price shown on the page goes up as soon as the buyer fills a paid field, and goes back down if they empty it. On the product list and on category pages, the add to cart button of a product whose fields are switched on opens its product page, so the buyer fills the fields before the product reaches the cart. The answers stay with the product whether the buyer orders through the cart or straight from the product page. ## How the extra price is counted An extra price is charged only when the buyer fills that field. An optional field left empty adds nothing. The extra price is added to the price of one piece: a buyer who orders 2 mugs with a paid name pays it twice. When the buyer picks a quantity offer, it is added once to the offer price. The amount always comes from the field as you saved it, not from what the buyer's page displayed. ## Where you read the answers Open the order from **Orders**. Under each product line, the order page lists every field title with the buyer's answer: the text as typed, or a thumbnail of the image. Click the thumbnail to get the original image file. A paid field also shows its extra price in brackets, for example (+200 DA). ## What it costs Product Add-ons has no fee of its own: it is part of the Pro, Unlimited and Enterprise plans. On the Free plan, the card shows a **PRO** badge and an **Upgrade to Pro** button that opens the subscription page. See the [Pro plan](https://dzbuild.com/docs/plans/pro.md). The extra prices you set are part of the order total, paid by the buyer like the product itself. ## For developers The fields can also be read and replaced over the DZBuild API. A personal API key from **Dashboard → Settings → API** needs an active Enterprise plan and carries both scopes below by default; apps follow their own [access rules](https://dzbuild.dev/concepts). | Endpoint | Scope | What it does | | ------------------------------- | ---------------- | --------------------------------------------------------------------------------------- | | `GET /v1/products/{id}/addons` | `products:read` | Returns the product's fields and its on/off switch, `enabled` | | `POST /v1/products/{id}/addons` | `products:write` | Replaces all the product's fields with the list sent (at most 20) and can set `enabled` | Add a required name at 200 DA to product 42 and switch its fields on: ``` curl -X POST https://api.dzbuild.app/v1/products/42/addons \ -H "Authorization: Bearer $DZBUILD_API_KEY" \ -H "Idempotency-Key: product-42-addons-1" \ -H "Content-Type: application/json" \ -d '{"enabled": true, "addons": [{"title": "Name to print", "input_type": "text", "max_length": 20, "extra_price": 200, "is_required": true}]}' ``` Every POST needs an `Idempotency-Key` header, and sending `"addons": []` removes every field. The [Products API page](https://dzbuild.com/api-docs/resources/products.md) lists every field, with sample responses and error codes. ## FAQ **Can one product have several fields?** Yes. Combine them as you need, for example an image upload for the photo and a short text for the name on the same mug. The product page shows them in the order you set. **Do the fields show on my landing pages?** No. They show on the product page of your store only. An order placed from a landing page does not collect them. **I edited or deleted a field. What happens to past orders?** Nothing changes on them. Each order keeps the field title, the answer and the extra price as they were when the buyer ordered. **Can the buyer send a PDF or another kind of file?** No. The upload accepts images only: JPG, PNG, GIF and WEBP, up to 5 MB. --- Source: https://dzbuild.com/docs/addons/product-reviews.md # Product Reviews **Category:** Storefront  ·  **Min plan:** Free  ·  **Slug:** `product-reviews` Allow customers to leave reviews on products, with automatic verified-purchase detection against delivered orders. ## Video tutorial [Product Reviews](https://www.youtube-nocookie.com/embed/Wb_1m-V3MHA) ## Features * Star ratings (1-5) * Automatic verified-purchase badge, matched against delivered orders * Manual "mark as verified purchase" action * Review moderation dashboard * Anti-spam: one review per device per product, plus IP rate limiting ## How it works After activation, every product page renders a review widget below the description. Customers leave a **name** and a **1-5 star rating** — both mandatory — plus an optional comment and an optional phone number. The phone number is never displayed publicly and is not kept in readable form. Reviews display **verified ones first**, ten at a time behind a **Show more** button. A moderation dashboard lives at [`/dashboard/reviews`](https://dzbuild.com/dashboard/reviews). While the add-on is on, a **Reviews** link to it appears in the dashboard sidebar, and the add-on's card in the **Management Tools** section of the Add-ons page links there too. From that page you publish, reject, delete, or manually verify reviews. You cannot reply to a review; there is no public reply feature. ## The verified-purchase badge A review earns the **Verified purchase** badge automatically when DZBuild can tie the reviewer to an order that reached **delivered** status. A placed-but-undelivered order does not qualify. The matching is automatic and best-effort. It can miss a genuine buyer (use **Verify manually** in the dashboard for those) and it can occasionally credit someone who is not the buyer. Treat the badge as a strong trust signal, not as proof. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Product Reviews** under *Storefront*. 3. Click **Activate** (Free plan). 4. Configure it from the collapsible **Settings** card on the [`/dashboard/reviews`](https://dzbuild.com/dashboard/reviews) page — the add-ons card's button is just a link there. Three settings: * **Auto-approve**: on by default. * **Minimum rating for auto-approve**: reviews below this rating queue for moderation (1-5, default 1, i.e. all auto-approve). * **Show on product page**: on by default. The reviewer name is always required (2-200 characters); there is no setting to make it optional. ## Moderation Open [`/dashboard/reviews`](https://dzbuild.com/dashboard/reviews) to see the queue. Four stat cards sit at the top: **Total reviews**, **Pending**, **Published**, **Verified purchases**. The Pending card is where you check the moderation backlog; there is no pending-count badge on the sidebar link. For each review you can: * **Publish** / **Reject** / **Delete** (Reject and Delete are icon buttons: a cross and a bin) * **Verify manually** (the badge icon): if you recognise a genuine buyer that automatic detection missed, you can grant the badge by hand. The dashboard records that it was done manually. * See the linked product, the rating, and whether it carries the verified-purchase badge Filtering is by **status only**: All / Pending / Published / Rejected, plus a free-text search box that matches the reviewer name and the review text. There is no product or rating filter. ## Anti-spam Two distinct protections: 1. **One review per browser per product** — a repeat submission on the same product from the same browser is rejected outright. 2. **Rate limiting per IP address** — a burst of reviews from the same connection is throttled. There is no keyword or profanity filtering. The only content handling is HTML stripping and length limits: name 2-200 characters, review text up to 2000 characters. For stronger spam protection on storefronts that take cold traffic, also activate [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md). ## Turning it off Deactivating hides the storefront widget and the dashboard link, but **never deletes reviews** — re-activating brings them all back exactly as they were. The sidebar link can take up to 5 minutes (or a re-login) to appear or disappear after you toggle the add-on. ## Tips * Leave **auto-approve** on if your store is low-volume — you will catch any abusive review later. Turn it off only when running heavy paid traffic. * Set **minimum rating for auto-approve** to 3 or 4 if you start receiving spam: 1- and 2-star reviews queue for review while normal positive reviews still flow through. * Verified-purchase badges are powerful trust signals for cold traffic. Don't filter them out by being too strict on moderation. * Reviews appear inline on the product page. They do **not** currently feed the product structured data, so star ratings will not show in Google results. --- Source: https://dzbuild.com/docs/addons/shopify-import.md # Import Products from Shopify to DZBuild **Category:** Tools  ·  **Min plan:** Pro  ·  **Slug:** `shopify-import` **Shopify Import** copies your whole Shopify catalogue — products, variants, images and collections — into your DZBuild store in one click. It is built for merchants who already sell on Shopify and want to move to DZBuild without retyping a single product, and it connects through Shopify's official authorisation screen, so there is no token to copy and paste anywhere. ## Features * 1-click OAuth connect * Import products with descriptions, prices, SKUs * Re-uploads images to your DZBuild CDN * Maps the full variant matrix (Color × Size × …) * Imports Collections as Categories * Pick all or specific products * Background import with live progress ## How it works The add-on page walks you through a three-step wizard shown at the top of the screen: **Connect → Choose products → Import**. 1. **Connect.** You type your Shopify domain and DZBuild sends you to Shopify's own permission screen. Shopify asks you to grant **read-only** access to your products, product listings and inventory — nothing on your Shopify store can be modified. 2. **Choose products.** Back on the add-on page you load a preview of your Shopify products — each one with its thumbnail, price and variant count — and tick the ones you want, or import everything. 3. **Import.** The import runs in the background with a live progress bar. You can close the page and come back later. ### What comes across for each product * **Product fields** — name, description, price, compare-at price, SKU and weight. Weight is converted to kilograms whatever unit Shopify used (`g`, `kg`, `lb`, `oz`). * **Images** — every image is downloaded from Shopify and re-uploaded to your DZBuild storage, keeping Shopify's order. The first image becomes the product's main image. Your storefront never hotlinks Shopify. * **Variants**: Shopify's option groups become DZBuild variant groups (up to three, such as Color × Size × Material). When a product has two or three option groups, every Shopify variant becomes one DZBuild combination with its own SKU and stock. A product with a single option group keeps its options but one stock number for the whole product. Variant prices are not copied: every option and combination uses the product price, taken from the first Shopify variant, so set any price differences in the product editor after the import. A group named `Color` / `Colour` / `Couleur` / `اللون` is created as a **colour swatch** group, and recognised colour names get their swatch colour automatically; every other group is created as a text group. * **Stock**: quantities come across as well. Products with two or three option groups are switched to per-combination stock so each combination keeps its own number; every other product gets one stock number, the total of its Shopify variants. * **Collections** — each Shopify collection the product belongs to becomes a DZBuild category, created on the fly if it does not exist yet. The first one becomes the product's main category. tip A Shopify product that has already been imported is **skipped** on the next run, so re-running an import never creates duplicates. To refresh already-imported products instead, turn on **Overwrite if already imported**. ## Benefits * **Migrate in an afternoon, not a month.** A catalogue of hundreds of products with photos and variants lands in DZBuild without a single copy-paste — the work that usually blocks a store move disappears. * **Your photos live on your own store.** Images are re-hosted on DZBuild's own storage, so your product pages keep loading normally after you close your Shopify account. * **No risk to your Shopify store.** The authorisation is read-only, so nothing you approve can edit, delete or unpublish anything on the Shopify side. You can disconnect at any moment. * **Variants survive the move.** Colour and size matrices, per-combination SKUs and per-combination stock arrive intact instead of being flattened into separate products. * **Import at your own pace.** Pick a handful of products to test the result first, then come back and import the rest — already-imported products are skipped automatically. * **You stay in control of what goes live.** Shopify drafts arrive as drafts, and you can switch any imported product to draft in bulk to review prices and translations before customers see them. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Shopify Import** under *Tools*. 3. Click **Activate**. The add-on requires the **Pro** plan or higher — on the Free plan the card refuses activation and asks you to upgrade. 4. Open the add-on's **Settings** button to reach its page at `/dashboard/addons/shopify-import`. warning If the connect form is greyed out and the page shows a configuration notice, the Shopify connection is not available on the platform side yet — contact support rather than retrying. ## Using it ### Connect your Shopify store 1. On the add-on page, type your Shopify domain in **Your Shopify domain**. The field accepts `mystore.myshopify.com` or the bare `mystore`. Type the `myshopify.com` address rather than pasting a link from your Shopify admin, which the form refuses. 2. Click **Connect with Shopify** and approve the read-only access request on Shopify. 3. You come back to a **Connected** card showing the shop name, its currency and the connection date, plus a **Disconnect** button. warning If your Shopify shop currency differs from your DZBuild store currency, a warning appears on the Connected card and prices are imported **exactly as they are**, with no conversion. Products that are active on Shopify still arrive live, so set them to **Draft** with bulk edit in **Products** until you have fixed their prices. ### Choose what to import * Click **Show my products** to load the preview. Products arrive in pages with a button to load more, each row showing the image, title, price and number of variants. * Use the **search box** to filter the loaded list, and **Select all** / **Clear** to tick or untick everything at once. * Open **Advanced options** (collapsed by default) for four toggles: * **Include drafts** — unpublished Shopify products. Skipped by default. * **Include archived** — archived (hidden) Shopify products. Skipped by default. * **Overwrite if already imported** — update products imported earlier instead of skipping them. Images are not downloaded again. * **Publish imported products**: this switch does not change the status of imported products. Products that are active on Shopify arrive live, and Shopify drafts (when **Include drafts** is on) arrive as drafts. To check prices before customers see them, set the new products to **Draft** with bulk edit in **Products** right after the import. * The import button reads **Import all** when nothing is ticked, and **Import selected (N)** once you pick products. ### Follow the import * A progress bar shows how many products have been processed out of the total, plus counters for failed and skipped products. * **Cancel** stops the run — the products already imported stay. * Only one import can run per store at a time. Starting a second one while another is in flight is refused with a clear message. * When the run ends you get a summary: imported, failed, and skipped. From there you can jump to **View products**, **Import other products**, or retry. Skipped counts products imported earlier and also Shopify drafts and archived products that **Advanced options** left out, so if a first import skips everything, turn on **Include drafts** or **Include archived** and run it again. * If everything was skipped, the page tells you so and offers **Enable overwrite & retry** in one click. If some products failed, the button becomes **Retry failed products**: it runs the same products as your last import again with **Overwrite if already imported** turned on, so the products that did import are refreshed too. An **Error details** section lists what went wrong. ### Disconnect **Disconnect** removes the link to your Shopify shop. Imported products stay in your DZBuild store; you simply have to authorise again if you want to import more later. ## FAQ **Does importing change anything on my Shopify store?** No. The access you grant is read-only on products, product listings and inventory, so the add-on can read your catalogue but cannot modify, unpublish or delete anything on Shopify. **What happens if I run the import twice?** Products already imported are skipped, so you never end up with duplicates. If you want to refresh them with the latest Shopify data, tick **Overwrite if already imported** before starting. That updates the product fields, empties the cost price, sets each product's status back to its Shopify status and rebuilds its variants, but it does not download the images a second time or refresh the stock of products without combinations. **Will my prices be converted to Algerian dinars?** No. Prices are imported exactly as they are in Shopify. If the two currencies differ, the page warns you. Products that are active on Shopify arrive live, so set them to Draft with bulk edit in [Products](https://dzbuild.com/docs/selling/products.md) until their prices are right. **Do I have to keep the page open until it finishes?** No. The import runs in the background — you can close the tab and come back to the add-on page later to see the progress bar or the final summary. **My Shopify products have colour and size options. Do those survive?** Yes. Each option group becomes a DZBuild variant group. With two or three groups, each Shopify variant becomes a combination with its own SKU and stock; with one group, the product keeps a single stock total. Variant prices are not copied, so every variant starts at the product price. Colour groups are created as swatches. See [Variants](https://dzbuild.com/docs/selling/variants.md) for how to fine-tune them afterwards, and [Add-ons overview](https://dzbuild.com/docs/addons/overview.md) for the other catalogue add-ons you can pair with this one. --- Source: https://dzbuild.com/docs/addons/short-links.md # Short Links & QR Codes **Category:** Marketing  ·  **Min plan:** Free  ·  **Slug:** `short-links` Short links turn a long store address into a compact link you can drop into an Instagram bio, a TikTok caption, a WhatsApp broadcast or a printed flyer — and every short link comes with a downloadable QR code. The add-on lives entirely in your dashboard at `/dashboard/short-links`: you pick which page of your store the link should open, DZBuild builds the short link for you, and the page shows how many clicks each one has collected. ## Video tutorial [Short Links & QR Codes](https://www.youtube-nocookie.com/embed/RxPTfrwJGcg) ## Features * Short links to a product, landing page, category, all-products page, or your homepage * Built on the shared DZBuild short-link domain, the same one for every store * One-tap copy and a downloadable QR code for every link * Click tracking for each short link * Honors your store's custom domain ## What it does Activating the add-on adds a **Short links** entry to your dashboard sidebar and opens a page with two blocks: a **Create a short link** form at the top and **Your short links** below it. You never paste a URL. You choose a **destination** from a dropdown, and DZBuild builds the address from your own store data: | Destination | Opens | | ------------ | ---------------------- | | Product | that product's page | | Landing page | that landing page | | Category | that category page | | All products | your all-products page | | Homepage | your store homepage | For **Product**, **Landing page** and **Category** a second dropdown appears listing your own active products, active landing pages and active categories. Only pages that belong to your store can be turned into a short link — which is also why the short link can never be pointed somewhere else by mistake. You can add an optional **title** (up to 255 characters, e.g. `summer campaign`) so you can tell your links apart later. It is a label for you; it does not appear in the short link itself. Each created link is stored as a card showing: * a badge with the destination type, * your optional title, * the destination address (shortened for display, clickable), * the short link itself with a **Copy** button, * the **Clicks** count with a **Refresh** button, * a **QR code** button and a **Delete** button. The counter above the list shows how many links you have created out of the maximum for your store (1000). ## Benefits * **One link that fits anywhere.** Instagram and TikTok bios, ad captions and SMS are all short-form surfaces; a full product URL with a long slug often gets cut or looks untrustworthy. * **You learn which channel works.** Create one link per destination, share it, then check the click count — you see how much traffic that page really pulled. * **Offline traffic becomes measurable.** Download the QR code and put it on a flyer, a package insert or a shop window; scans land on the same tracked link. * **Nothing changes on your storefront.** The add-on is dashboard-only: your store pages, checkout and order flow behave exactly as before, so activating it carries no risk to your sales. * **Your custom domain is where visitors land.** The short link itself is on the DZBuild short-link domain, which every store shares, but if your store runs on a verified custom domain the visitor lands on that domain and not on the default subdomain. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Short Links & QR Codes** under *Marketing*. 3. Click **Activate** (Free plan — available on every plan). 4. Unlike most add-ons, this one takes you straight to its management page at [`/dashboard/short-links`](https://dzbuild.com/dashboard/short-links), and a **Short links** entry appears in the sidebar. If you open the page before activating, you get an "add-on is not active" screen with a button back to the Add-ons page. See the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md) for the full list. ## Using it ### Create a link 1. Go to **Dashboard → Short links**. 2. Pick the **destination** type. 3. For a product, landing page or category, pick the exact item in the second dropdown. 4. Optionally type a **title**. 5. Click **Create**. The new link appears at the top of the list immediately. tip There is one short link per destination. If you create a link for a product that already has one, DZBuild returns the existing link and tells you a link already exists for that destination — you will not end up with two competing links for the same page. ### Copy, QR code, clicks * **Copy** — the copy button next to the short link puts it in your clipboard. * **QR code** — the QR button opens a window with the QR code and the link underneath. **Download** saves it as a PNG image you can drop into a flyer, a story or a package insert. * **Clicks** — each card shows the click count. It does not update by itself: press the refresh button on the card to fetch the latest number. Pressing it repeatedly within a few seconds simply returns the number that was just fetched. * **Delete** — removes the link from your list after a confirmation. warning The destination is stored when the link is created. If you later connect a [custom domain](https://dzbuild.com/docs/customizing/custom-domain.md), or change a product's or category's slug, existing short links keep pointing at the old address. Delete those links and create them again so they follow the new address. The new link is a different short link and the old one keeps opening the old address, so replace it wherever you shared or printed it. If the short-link service is being set up, a notice appears at the top of the page and the **Create** button is disabled. Existing links, their QR codes and their click counts are unaffected — try again later. ## FAQ **Q: Can I shorten any URL, like a competitor's page or a Google Form?** A: No. The destination is always one of your own store pages, chosen from the dropdowns. This is deliberate: the short-link domain is shared by every DZBuild store, so keeping it closed to outside URLs is what keeps it trustworthy. **Q: Can the short link use my own domain?** A: No. All DZBuild short links are created on one short-link domain that every store shares, and it cannot be swapped for yours. Your own domain is what the visitor sees after the redirect, once your [custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) is verified. **Q: Which plan do I need?** A: The Free plan is enough. Every DZBuild plan can activate it. **Q: Do the click counts refresh on their own?** A: No. Open the page and press the refresh button on a link to pull its current count. The number you see otherwise is the last one that was fetched. **Q: I deleted a link by mistake — is it gone forever?** A: Create it again for the same destination and you get the same short link back, so anything you already printed or posted keeps working. Treat delete as tidying your list, not as a way to switch a shared link off. **Q: Where should I use these links?** A: Anywhere a long URL is awkward — social bios, ad captions, SMS and WhatsApp messages, and printed material via the QR code. They pair well with [landing pages](https://dzbuild.com/docs/selling/landing-pages.md) for campaign traffic and with your [pixels](https://dzbuild.com/docs/marketing/pixels.md) for measuring what those visitors do next. --- Source: https://dzbuild.com/docs/addons/stock-management.md # Manage and update stock Use this page when new stock arrives or you need to correct a quantity. First, [enable stock tracking on the product](https://dzbuild.com/docs/selling/variants.md#stock-modes). The **Stock Management** add-on is available on the **Free plan and above**. It is paused on stores using the Digital theme. ## 1. Open Stock Management If you have not activated it yet: 1. Open **Dashboard → Add-ons**. 2. Find **Advanced Stock Management** (*Gestion avancée du stock*) under Inventory. 3. Press **Activate**. 4. Open **Stock Management** from the sidebar. You can also [open Stock Management directly](https://dzbuild.com/dashboard/stock-management). Only products with stock tracking enabled appear here. The add-on does not enable tracking for you. ## 2. Find your product Search by the **product name or product SKU**. If it does not appear, clear the stock filter and try again. The example below is our saved sports-shoe product. It has **20 pairs** across four combinations. The screenshots show the real French dashboard with demonstration data. For a product with variants or combinations, press **Details** (*Détails*) to see the individual quantities. ![Saved demonstration product expanded to show its four combinations and stock](/assets/images/fr-inventory-656b1133f5f1c7a18c04e94fb9cfdfa0.png) **Check:** you are looking at the right product, colour and size. Green + 40 has **8** pairs; Black + 41 has **0**. ## 3. Enter the new quantity Suppose **4 more Green + 40 pairs** arrive. You had 8, so your new total is **12**. 1. Press the quantity **8**, or its pencil, beside Green + 40. 2. Replace it with **12**. 3. Press the **check mark** to save. On a keyboard, you can press **Enter**. ![The stock quantity opened for editing, with save and cancel controls](/assets/images/fr-inventory-edit-2cdb9a92d405f6a4b772e8c98396e13e.png) The field is open with the old quantity **8**. Replace it with **12**, then save. **Enter the new total, not the delivery quantity.** Entering 4 would replace the stock with 4. The cross cancels the edit. On a keyboard, **Escape** also cancels. For a product using simple stock, press its quantity directly in the main row. There is no combination detail to open. ## 4. Check after saving Wait for the saved message, then reload the page and search for the product again. **Check:** Green + 40 now shows **12**. The other quantities should be unchanged. Its total would now be **24** pairs. A buyer who already has the storefront open may need to refresh it to see the new availability. ## What the stock numbers mean | Display | Meaning | | ----------------- | ------------------------------------------------------ | | Product stock | One quantity for the whole product. | | Variant stock | A separate quantity for each option. | | Combination stock | A separate quantity for each colour and size together. | | 0 | That tracked item is sold out. | | Unlimited | No fixed quantity has been entered for that option. | The headline total sums the tracked options or combinations. Unlimited quantities do not add units to that total. Open **Details** if a total does not match what you expected. Do not replace every combination with the total stock of the whole product. Enter each combination's own quantity. ## When orders reduce stock Open **Orders → Display settings** using the gear button. In **Stock deduction**, choose: * **At order confirmation**: the default. * **As soon as the order arrives**: stock is reduced from receipt of a new order, before confirmation. Save the setting. This applies to the store, not just the product you are editing, and only to new orders: orders already waiting are deducted when you confirm them. A team member needs permission to edit orders to change it. Cancelling an order, or marking it returned yourself, restores the stock that was deducted for it. When a courier returns a parcel, the stock comes back once the parcel is back with you: the courier confirms it, you press **Return received** in the order window, or 15 days pass, whichever comes first. The **Sold** and **Returned** columns show recorded activity; they are not fields for adding new stock. ## Find items that need attention Use **In stock**, **Low stock** or **Out of stock** to narrow the list. A product counts as out of stock at 0 or below and as low stock at 5 units or fewer, or at its own alert level if one was set through the API. You can also sort by quantity, name or best sellers. You can edit a product or option's SKU using its pencil. Keep your reference codes distinct; a duplicate badge helps you spot repeated codes. ## If you get stuck | Problem | What to do | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | Product missing | Enable stock tracking in its editor, save, then clear the filters here. | | Total cannot be edited | Press Details and edit the option or combination quantity. | | Unlimited quantity has no pencil | Open the product editor and enter a fixed quantity there. | | Wrong quantity after restocking | Enter old stock plus the new delivery, not just the delivery amount. | | Save failed | Keep the intended quantity noted, read the error and retry after correcting it. Reload to confirm the saved value. | | Add-on is paused | Stock Management is not active on the Digital theme. | ## Watch the stock tutorial [Stock Management in DZBuild](https://www.youtube-nocookie.com/embed/pavWoJHjZ1k) [Return to variants and combinations](https://dzbuild.com/docs/selling/variants.md) --- Source: https://dzbuild.com/docs/addons/stop-desk.md # Stop Desk Selector **Category:** Storefront  ·  **Min plan:** Free  ·  **Slug:** `stop-desk` Let customers choose a specific desk/pickup point when selecting desk delivery. ## Video tutorial [Stop Desk Selector](https://www.youtube-nocookie.com/embed/WXLRs4eZO-k) ## Features * Desk selection on checkout, fast-checkout and landing pages * Desk name, address & phone in a detail card * Served from DZBuild's own pre-synced desk list — no live courier call * Inert (changes nothing) when your couriers have no desk data ## Stop desk vs. this add-on In DZBuild, **stop desk** is two distinct things: 1. A **delivery type**: *desk delivery* on an order, as opposed to *home delivery*. This works without any add-on, but **the customer never names a desk**: desk delivery is a cheaper delivery choice priced by your own desk rate, and the office is picked at send time. Couriers that need a specific office still get one when you send the order: a desk of that courier in the customer's commune, else one elsewhere in the wilaya, and the send is refused when the wilaya has none. 2. **This add-on** — adds a structured picker listing the actual desks available in the customer's wilaya, with address and phone. So the add-on doesn't replace anything: it adds a picker that didn't exist. You only need it if you want customers to choose a specific desk. A separate add-on, **Pickup From Store**, is often confused with this one. Stop Desk selects one of the *courier's* desks; Pickup From Store selects one of *your own* locations. For courier setup details (which couriers expose desk lists, how addresses are synced), see [Couriers → Stop Desk](https://dzbuild.com/docs/couriers/stop-desk.md). ## Why use it * Customers picking up at a desk want to know exactly where: which desk, what address, what phone to call if they're late. Without the picker they get none of that at checkout. * Without it, the parcel goes wherever the fallback lands: any desk in the customer's commune, else any desk in the wilaya. The customer had no say in it. * With it, the desk the customer picked is the one sent to the courier. ## How to activate 1. Make sure at least one of your couriers is **linked** and has desk data synced (see the courier list below, and [Couriers → Stop Desk](https://dzbuild.com/docs/couriers/stop-desk.md)). 2. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 3. Find **Stop Desk Selector** under *Storefront*. 4. Click **Activate** (Free plan). Activating it can never break desk delivery If none of your linked couriers has any desk data at all, the add-on stays completely inert store-wide: nothing renders and desk delivery keeps behaving exactly as it did before, on your own pricing settings. There is no risk in trying it. ## Which couriers supply desks | Courier | Desk data | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | ZR Express New, NOEST, EcomDelivery | Real desk locations: name, address, phone | | Yalidine, Guepex, Easy & Speed, Economiqua, Zimou Express, Elogistia, MDM Express, Near Delivery | Real desk locations with name and address; these couriers publish no desk phone number | | Maystro | Real desk locations with their name only | | EcoTrack-based couriers, Colivraison | Commune-level only — a "has desk delivery" flag, so entries read *Courier — Commune* with no address or phone | | ZR Express (old / Procolis) | No named desks. Every commune of a wilaya that carries a stop-desk price is offered as a commune-level entry under the ZR Express name, with no address or phone, and ZR picks the actual office when it dispatches the parcel | The add-on still works for the commune-level couriers — it just shows less detail. ## Where the picker appears All three order surfaces, so it covers your whole funnel: * The standard checkout page. * Fast-checkout on the product page (all five fast-checkout styles, including `commerce`). * Landing-page order forms. ## How it behaves at checkout When the customer picks **Desk delivery**: 1. The storefront loads the desk list for their selected wilaya from **DZBuild's own pre-synced desk list** — not from a live courier call. It stays fast and keeps working even when the courier's API is down. 2. Each entry appears in a dropdown, labelled *Courier — Commune | address* (address truncated to the first 50 characters). When several couriers are linked, the courier's proper display name prefixes each option — including the custom name you gave a custom EcoTrack integration — so the customer can tell whose desk they're choosing. 3. Once a desk is selected, a detail card below the dropdown shows its full name, address and phone. Commune-level entries show the courier and commune only. 4. The selection is stored alongside the order. The order shows the chosen desk and its courier, and when you send the order, that courier is selected for you. Keep it: if you send the order with another courier, that courier picks its own office instead. ### When there are no desks There is no "picker with no entries". Three different things happen depending on the level: * **The wilaya has no synced desks** — the desk delivery option is removed entirely and an informational notice explains that there is no desk in that wilaya. * **The list comes back empty after selection** — the checkout silently switches the customer to **home delivery at the home price** and recalculates the total. Be aware this changes the shipping charge the customer sees. * **No linked courier has any desk data** — the add-on is inert store-wide and desk delivery behaves exactly as before activation. ## Tips * Desk availability is evaluated at **wilaya** level, not commune level. If any desk exists anywhere in the customer's wilaya, the desk option is offered — even when their own commune has none, because they can pick a desk elsewhere in the wilaya. Your own wilaya-level "desk delivery enabled" setting still has the final say. * The picker loads desks per wilaya, so customers must select their wilaya **before** the desk dropdown becomes usable. (DZBuild's checkout already enforces that order — the dropdown starts disabled.) * With [Multi-Language](https://dzbuild.com/docs/addons/multi-language.md), the commune in each desk entry shows in French for visitors browsing in French and in Arabic otherwise; desk names and addresses always show exactly as the courier publishes them. ## Compatibility * **Paused on the `digital` theme.** While your store runs the digital theme the add-on stays paused — paused, not uninstalled, and resumes automatically if you switch back to a physical-goods theme. --- Source: https://dzbuild.com/docs/addons/webhooks.md # Webhooks for n8n, Make and Zapier **Category:** Tools  ·  **Min plan:** Unlimited  ·  **Slug:** `webhooks` The **Webhooks** add-on pushes your store's order events to any automation tool that accepts a JSON `POST` over HTTPS — n8n, Make, Zapier, or your own server. Add your webhook URL once and DZBuild sends a signed notification the moment an order is created or its status changes, so you can build your own flows: CRM sync, WhatsApp messages, Google Sheets, custom confirmations, anything. ## Video tutorial [Webhooks for n8n, Make and Zapier](https://www.youtube-nocookie.com/embed/CUE_ne4Olws) ## Features * Works with n8n, Make, Zapier or any endpoint that accepts a JSON `POST` * Events for new orders and every status change (confirmed, processing, shipped, delivered, cancelled, returned) * Signed payloads (HMAC-SHA256) so your endpoint can verify authenticity * Automatic retries with backoff when your endpoint is down * Delivery log with status, attempts and errors for every event * Each endpoint gets its own signing secret, regenerable at any time * No impact on your storefront speed — events are delivered in the background ## What it does Activating the add-on adds a **Webhooks** entry to your dashboard sidebar and a management page at `/dashboard/webhooks`. There you register one or more **endpoints** — the receiving URLs your automation tool gives you. Each endpoint listens to the events you tick. These are the available events: | Event | Fires when | | ------------------ | ------------------------------- | | `order.created` | A new order lands in your store | | `order.confirmed` | You mark the order as confirmed | | `order.processing` | The order moves to processing | | `order.shipped` | The order is shipped | | `order.delivered` | The order is delivered | | `order.cancelled` | The order is cancelled | | `order.returned` | The order is returned | Every delivery is a JSON `POST` with an envelope carrying an event `id`, the `event` name, a `created_at` timestamp, your `store_id` and a `data` object. For order events, `data` holds the order (order number, status, payment and delivery type, customer name and phone, wilaya and commune, subtotal, shipping, discount and total, promo code, tracking number and delivery company) plus the list of its items. Status-change events also carry `previous_status` in `data`, the status the order had before the change. ``` { "id": "evt_...", "event": "order.created", "created_at": "2026-08-12T10:20:30+00:00", "store_id": 123, "data": { "order": { }, "items": [ ] } } ``` ### Verification handshake A brand-new endpoint receives **no real events** until it proves it is listening. Right after you add it, DZBuild sends a `webhook.verify` event; as soon as your URL answers with a success status (HTTP 200), the endpoint flips from **Pending verification** to verified and starts receiving your order events. Most of the time this happens in the same click; otherwise it retries on its own, usually within a minute. ### Signature and headers Every event carries headers your tool can check: ``` X-DZ-Token: X-DZ-Timestamp: 1754200000 X-DZ-Signature: t=1754200000,v1=hex( HMAC_SHA256( secret, timestamp + "." + rawBody ) ) X-DZ-Event: order.created X-DZ-Delivery: 12345 ``` * **No-code check** — compare `X-DZ-Token` against your secret. In n8n this is the built-in *Header Auth* credential. * **Advanced check** — compute HMAC-SHA256 with your secret over `timestamp + "." + rawBody` and compare it to the `v1` value. Reject anything older than 5 minutes. `X-DZ-Event` repeats the event name and `X-DZ-Delivery` numbers the delivery. A retried delivery keeps the same `X-DZ-Delivery` and the same envelope `id`, so your flow can use either one to skip duplicates. ### Retries and auto-disable If your endpoint is down, takes more than 10 seconds to answer, or answers with anything other than a 2xx status (a redirect counts as a failure), DZBuild tries the delivery up to 5 times in total, waiting about a minute after the first failure, then 5 minutes, 30 minutes and 2 hours. Once the fifth attempt fails the delivery is marked as permanently failed in the log and is not retried again. An endpoint that keeps failing (10 consecutive failed deliveries) is disabled automatically, and the row shows a note telling you to fix your server and re-enable it. Re-enabling resets the failure counter. ## Benefits * **Automate the boring part of COD.** A new order can create a CRM record, append a row to Google Sheets, or trigger a WhatsApp confirmation without you touching the dashboard. * **React to status changes instantly.** Shipped and delivered events let you send your own follow-up messages, or update an external sheet your call-centre team works from. * **No polling, no export files.** You stop exporting orders manually — the events arrive as they happen. * **You can trust what arrives.** Signed payloads mean your flow can reject anything that did not come from DZBuild. * **Failures are visible.** The delivery log shows exactly which events landed, how many attempts they took and the error your server returned — no guessing why a flow did not run. * **Your storefront stays fast.** Delivery happens in the background, so checkout speed is never affected. ## How to activate 1. Open **Dashboard → Add-ons** at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 2. Find **Webhooks** under *Tools*. 3. Click **Activate**. The add-on requires the **Unlimited** plan (Enterprise included) — on lower plans the card is locked. See [Plans → Unlimited](https://dzbuild.com/docs/plans/unlimited.md). 4. Activation takes you straight to the management page, and a **Webhooks** entry appears in the dashboard sidebar. warning If a notice says the webhooks service is being set up, the **Add** button stays disabled. Try again later or contact support — nothing is wrong with your store. ## Using it ### 1. Add an endpoint 1. In your automation tool, create a Webhook trigger (in n8n, the *Webhook* node) and copy its receiving URL. 2. Paste it into **Webhook URL** on `/dashboard/webhooks`. 3. Tick the events you want — **New order** is pre-selected; at least one event is required. 4. Click **Add**. URL rules the form enforces: the URL must start with `https://`, use the standard HTTPS port, point to a public domain name (not a raw IP address), carry no username or password, be 255 characters or shorter, and not be a DZBuild domain or a `workers.dev` address (put a Cloudflare Worker behind your own domain instead). The same URL cannot be registered twice on the same store. The counter next to **Your endpoints** shows how many endpoints you are using out of the limit your plan allows — the Unlimited plan allows one endpoint, Enterprise up to three. ### 2. Save the secret Right after the endpoint is created, a window shows its **signing secret** with a copy button. warning The secret is displayed **once**. Copy it and store it safely — it is never shown again. If you lose it, use **Regenerate secret** on the endpoint row and update your tool with the new value; the old secret stops working immediately. The same window offers **Copy verification code (advanced)**, which copies a ready-made n8n *Code* node that checks the signature for you, with your secret already filled in. tip For a no-code setup in n8n, open the Webhook node, set *Authentication* to **Header Auth**, create a credential with the name `X-DZ-Token` and paste your secret as the value. Any request without that secret is then rejected automatically. ### 3. Verify and test * While the endpoint shows the **Pending verification** badge, click the send button on its row to resend the verification event. Once your URL answers successfully, the badge disappears. * On a verified endpoint the same button sends a **test event** (`webhook.test`) so you can confirm the whole flow end to end. It arrives in about a minute. The endpoint must be enabled for the button to work. ### 4. Watch the delivery log The list button on each row opens the **Delivery log** — the last 50 events for that endpoint, with columns for event, status, attempts, HTTP code, error and date. Statuses are *Pending*, *Sending*, *Delivered* and *Failed permanently*. ### 5. Manage endpoints Each row has buttons to send a test event, open the delivery log, regenerate the secret, pause or resume the endpoint, and delete it. Deleting an endpoint also removes its delivery log, and cannot be undone. While an endpoint is paused or disabled it gets no new order events, and resuming it does not replay the events it missed. Deactivating the add-on from [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) stops new events from being detected; your endpoints and their settings are kept, so reactivating later picks up where you left off. Nothing that happened to your orders while the add-on was off is sent afterwards: only new orders and status changes after you reactivate it send events. ## FAQ **Which plan do I need?** The Unlimited plan or above. On Free and Pro the add-on card is locked; upgrading unlocks activation — see [Plans → Upgrades](https://dzbuild.com/docs/plans/upgrades.md). **How many endpoints can I register?** One on the Unlimited plan, three on Enterprise. The counter next to **Your endpoints** shows where you stand, and once you reach the limit the **Add** button refuses a new URL until you delete one. To feed several tools from a single endpoint, branch the events inside your automation tool instead of registering a second URL. **Why does my endpoint say "Pending verification"?** Because your URL has not answered the verification event with a success status yet. Make sure the flow in n8n, Make or Zapier is **active** (not just in test mode) and that it replies HTTP 200, then press the send button on the row to retry. **My endpoint was disabled on its own. Why?** Because it failed too many deliveries in a row — usually a flow that was turned off, or a server that stopped answering. Fix the receiving side, then press the enable button on the row; the failure counter resets. **Do I need to write code to secure my webhook?** No. Checking the `X-DZ-Token` header against your secret is enough for most flows, and n8n does it for you with *Header Auth*. The HMAC signature in `X-DZ-Signature` is there if you want the stricter check. **Does this affect my store's speed?** No. Events are sent in the background, so your storefront and checkout are never slowed by a webhook — see [Selling → Orders](https://dzbuild.com/docs/selling/orders.md) for the order flow itself, and [Add-ons → Overview](https://dzbuild.com/docs/addons/overview.md) for the full add-on list. --- Source: https://dzbuild.com/docs/addons/whatsapp-sender.md # WhatsApp order messages for your buyers **Category:** Orders  ·  **Min plan:** Pro  ·  **Slug:** `whatsapp-sender` The **WhatsApp Sender** add-on writes to your buyer on WhatsApp at the moments that decide whether a cash-on-delivery parcel gets paid: when the order lands, when you confirm it, when it leaves with the courier, when the courier could not reach them, and when it is waiting at the pickup desk. Every message comes from the verified DZBuild WhatsApp Business number, carries the order number, ends with a **Track my order** button, and costs you one credit only when WhatsApp bills it. All of them except "Courier could not reach you" also carry your store name; that one names the courier instead. ## Video tutorial [WhatsApp order messages for your buyers](https://www.youtube-nocookie.com/embed/G69OMumShHs) ## Why it raises confirmation and delivery A buyer who ordered at 11 pm on a phone forgets by noon which page they ordered from. The call from an unknown number goes unanswered, the courier's call goes unanswered, and the parcel comes back at your expense. Each message in this add-on removes one of those failure points: * **Order received.** The buyer reads that your store got the order and that a call is coming to confirm it. The confirmation call now arrives to someone expecting it. * **On the way.** The buyer learns the courier's name, the expected delay and the exact amount to prepare. The message asks them to keep the phone reachable, so the courier's call lands. * **Courier could not reach you.** Instead of a silent second attempt, the buyer gets a message and can answer with a new time or a new address. The answer reaches you on Telegram and on the order page. * **Arrived at the desk.** For stop-desk orders, the buyer is told where the parcel is and that it is kept only a few days, so they can collect it before it goes back. The messages also leave something the phone call does not: a WhatsApp thread under your store's name, with the order number and a button to the tracking page. A buyer who opens WhatsApp weeks later and searches your store name finds that thread, and whatever they write there reaches you with the order it belongs to. ## What the buyer receives Five messages, each tied to an order event you can switch on or off. The texts are fixed because Meta approves them in advance; you choose the language and the delivery delay shown in the "on the way" message. | Message | When it is sent | Default | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | | Order received | The order lands in your store. The buyer reads that you will call to confirm. | Off | | Order confirmed | You mark the order confirmed. The buyer reads that it is being prepared and the amount due. | Off | | Order on the way | The order leaves with the courier. Home delivery: the courier will call, keep the phone reachable and the amount ready. Stop desk: the office it is heading to. | On | | Courier could not reach you | The courier reports a failed attempt on a home delivery. The buyer can reply to change the time or address. | On | | Arrived at the desk | The parcel reaches the pickup office. For a Pickup from Store order, it goes out when you mark the order shipped. The buyer is asked to collect it before it is returned. | On | What the "on the way" message looks like, home delivery, French: ``` Bonjour Ahmed, votre commande n° 1024 chez Ma Boutique est en route avec Yalidine. Livraison prévue sous 1 à 3 jours. Le livreur vous appellera avant d'arriver : restez joignable et préparez le montant de 3500 DA. Appuyez sur le bouton pour suivre votre commande. ``` Rules that apply to every message: * **Language.** Arabic or French for the whole store, chosen in the add-on settings. The store language is the default. * **Delivery delay.** Free text of up to 60 characters shown in the "on the way" message, for example "1 à 3 jours". * **Algerian mobile numbers only.** Numbers starting with 05, 06 or 07 get messages. Any other number is skipped and never charged. * **One message per event per order.** Moving an order back and forth never sends the same message twice. * **Track my order.** Every message ends with a button that opens your store's tracking page for that order. ## What it costs Messages are paid from a prepaid balance of credits, one credit per message. You top up in dinars, by global card (billed in USD) or by CIB / EDAHABIA card, in steps of 100 DA: | Top-up amount | Price per message | | -------------- | ----------------- | | From 2,000 DA | 4 DA | | From 8,000 DA | 3 DA | | From 15,000 DA | 2 DA | A single top-up goes up to 100,000 DA, and every message in the top-up is counted at the rate of the tier you reached. One credit is reserved when a message is queued. It is kept only when WhatsApp bills the message. A message that fails, a message that is still undelivered after 30 days, and a message WhatsApp delivered without billing (for example, sent while the buyer had written to you in the previous 24 hours) all return their credit to your balance. In the log, a delivered message that was not billed carries a **Free** tag; a failed or undelivered one shows **Refunded**. A number without WhatsApp is never charged: the first message to it fails and its credit comes back, and later messages to that number are skipped. The add-on page shows four counters for the last 30 days: delivered, read, failed and free, plus the number of credits charged this month. ## How to activate 1. Open **Dashboard → Add-ons** and activate **WhatsApp Sender**. The **WhatsApp messages** entry appears in the sidebar. 2. On the add-on page, top up your balance. The first messages go out as soon as the balance is above zero. 3. Choose the language and the delivery delay text, then switch on the messages you want. "On the way", "Courier could not reach you" and "Arrived at the desk" are on from the start. 4. Link your Telegram account in **Dashboard → Settings → Notifications** so buyer replies reach you on your phone. Nothing changes on your storefront. Orders keep coming in the same way; the add-on only watches their status. ## Replies from buyers A buyer who answers one of these messages is answering your store, not DZBuild. The reply is stored on the order page under the WhatsApp section, and if your Telegram is linked it arrives there as a card with the buyer's text, the order number and two buttons: **Reply on WhatsApp**, which opens a chat with the buyer from your own WhatsApp, and **Open order**, which opens the order in your dashboard. Since the messages go out from the DZBuild number, your reply comes from a different number than the one the buyer wrote to. The buyer sees your store name in the original message and your own number in the reply. Voice notes, images, videos and documents are recorded as a reply with their type and caption, without the file itself; a location shared by the buyer arrives as a map link. An emoji reaction is not stored. ## Which couriers trigger the delivery messages "Order received", "Order confirmed" and "Order on the way" depend only on the order status in your dashboard, so they work with every courier and with orders you ship yourself. The two other messages depend on what the courier reports back to DZBuild: * **Courier could not reach you** is sent when the tracking status shows a failed attempt with Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua, We Can Services, ZR Express, Abex Express, Leopard Express, Colilog, Flash Delivery, NOEST, Zimou, Colivraison and the couriers running on Ecotrack. * **Arrived at the desk** is sent when Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua, We Can Services, ZR Express, Abex Express, Leopard Express, Colilog or Flash Delivery report that the parcel reached the pickup office, and for Pickup from Store orders when you mark them shipped. With a courier that does not report these events, nothing is sent and nothing is charged. ## For developers The add-on is available over the DZBuild API, with the same templates and the same balance as the dashboard. An API key with the `whatsapp:read` and `whatsapp:send` scopes comes from **Dashboard → Settings → API** on the Enterprise plan, or from an installed app on any plan. | Endpoint | Scope | What it returns | | ------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `GET /v1/whatsapp/templates` | `whatsapp:read` | The six templates (one per message, with a home and a desk version of "on the way") with their Arabic and French text and approval status | | `GET /v1/whatsapp/balance` | `whatsapp:read` | The credit balance and the 30-day counters | | `GET /v1/whatsapp/messages` | `whatsapp:read` | The message log, filterable by order, with the `billing` field: `charged`, `free` or `null` while open | | `POST /v1/orders/{id}/whatsapp` | `whatsapp:send` | Queues one template for one order, paid from the balance like an automatic send | Send the "order confirmed" message for one order: ``` curl -X POST https://api.dzbuild.app/v1/orders/6894/whatsapp \ -H "Authorization: Bearer $DZBUILD_API_KEY" \ -H "Content-Type: application/json" \ -d '{"template": "confirmed"}' ``` The full contract, error codes and the message log fields are in the [WhatsApp messages API reference](https://dzbuild.com/api-docs/resources/whatsapp.md). Guides for building an app on the platform are at [dzbuild.dev](https://dzbuild.dev). ## FAQ **When are messages sent, and to whom?** Only at the moments you switch on: order received, confirmed, on the way, courier could not reach the buyer, and arrival at the pickup desk. Each message goes once per order, and only to Algerian numbers starting with 05, 06 or 07. **How much does a message cost?** 4 DA per message from 2,000 DA, 3 DA per message from 8,000 DA, 2 DA per message from 15,000 DA. You can raise the amount freely; every message in the top-up is counted at the rate of the tier you reached. One credit is reserved per send. **The buyer has no WhatsApp or the send fails. Do I pay?** No. A number without WhatsApp is never charged: the first message to it fails and its credit comes back (it shows "Refunded"), and later messages to that number are not sent and appear as "Not sent". A message that fails or is not delivered within 30 days is credited back automatically. If WhatsApp does not bill a delivered message (for example, sent while the buyer had written to you in the last 24 hours), it is credited back too and tagged "Free". You pay only what WhatsApp bills. **Can the buyer reply?** Yes. The reply appears on the order page and reaches you on Telegram with a button to answer from your store's WhatsApp. Messages go out from the official DZBuild number, so your reply does not come from the same number. **Which number does the buyer receive the message from?** The official, verified DZBuild WhatsApp Business account. Every message carries the order number, and all of them except "Courier could not reach you" name your store in the first line, so the buyer knows at once that it is about their order with you. That message names the courier instead. **The "arrived at the desk" message does not go out for some orders. Why?** It depends on what the courier reports. It works today with Yalidine, ZR Express and the couriers that send a "waiting for the customer" status. With the others, nothing is sent and nothing is charged. **Which messages are free?** Every message WhatsApp does not bill is free for you too. Today that is any message delivered within 24 hours after the buyer wrote to you, so a buyer who answers your messages makes the next ones free: it shows in the log with a **Free** tag and the credit stays in your balance. A message that fails or never arrives is credited back too and shows **Refunded**. **Can I change the text of the messages?** No. The texts are fixed because Meta approves them in advance. You control the language, which messages are sent, and the delivery delay shown in the "on the way" message. --- Source: https://dzbuild.com/docs/advanced/abandoned-cart-strategy.md # Abandoned cart recovery strategy A cart with a phone number in it is a buyer who nearly ordered and can still be called. If you run paid traffic and never work that queue, you have already paid for the click and stopped one step short. Here's the playbook. ## What "abandoned" means DZBuild captures a cart as **abandoned** only when two things are true: the visitor has typed a valid phone number (10 digits or more) **and** the cart is not empty. Simply opening the checkout captures nothing. Capture happens shortly after the phone number is entered, and again if the visitor leaves the page. The captured carts live at [`/dashboard/abandoned-carts`](https://dzbuild.com/dashboard/abandoned-carts) with the customer's name, phone, wilaya (when entered), and the products in the cart. Two silent exclusions are worth knowing: * A phone number that already ordered from your store in the **last 24 hours** is never captured. * Automated abuse checks can refuse a capture when an unusual number of them arrives from the same source in a short time. ### Where carts are captured from Capture is not limited to the full checkout page. The same queue is fed by: * The storefront checkout page * **Fast checkout on the product page** * **Landing-page order forms** * The digital-store checkout and product pages So merchants running landing-page traffic only still get abandoned carts. The trick is acting on them quickly — recovery rates collapse with every hour that passes. Plan requirement Full access to abandoned-cart data (unblurred phone numbers, one-click recovery, conversion modal) requires the **Pro plan or higher**. On Free, abandoned carts are captured but customer details are blurred and recovery actions are locked. Upgrade at [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) — see the **▶ How to renew** in-app guide or the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## The funnel ``` Visited → Added to cart → Entered phone → ABANDONED ↓ (recovery starts here) ``` ## Convert the cart straight into an order This is the highest-yield action on the page, and it sits behind a small icon that is easy to miss. Once you have the customer on the phone or on WhatsApp, **don't ask them to go back and re-order**. Place the order for them: 1. On [`/dashboard/abandoned-carts`](https://dzbuild.com/dashboard/abandoned-carts), click the bag icon on the cart row. 2. Confirm quantity, variant and wilaya in the modal — shipping is recalculated live. 3. Submit. DZBuild creates a real pending COD order, with the customer record, order items and variants, and tags the order notes with the cart it came from. Shipping is recomputed **server-side** from your own per-wilaya rates, including your free-shipping rule and threshold, so the shipping total is always your real total. The cart is marked recovered automatically. Requires the **Pro plan or higher**. ## Recovery is tracked for you You don't need a spreadsheet to know what worked. A cart flips to **recovered** by itself when the same phone number places an order in your store, from the storefront checkout, a landing page or an order you create yourself. A recovered cart then leaves the list, because the sale is now in your orders. You can also mark a cart **contacted** after your WhatsApp message or call, so the queue always shows who is still untouched. (Pro plan or higher.) Google Sheets If you have connected Google Sheets at [`/dashboard/addons/google-sheets`](https://dzbuild.com/dashboard/addons/google-sheets), new abandoned carts sync to your sheet automatically — including the products, variants and SKUs — and status changes (contacted, recovered) sync too. Useful if your call centre works from a spreadsheet. See [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md). ## Stage 1 — within 1 hour (highest yield) ### Tactic A: WhatsApp message Send a personal WhatsApp \~30–60 minutes after abandonment: > *"السلام، شفنا حابين تطلبو \[product]. كاينة شي حاجة نقدرو نوضحوها؟"* *"Bonjour, on a vu que vous étiez intéressé par \[product]. Une question avant de commander ?"* * **Cost:** operator time, nothing else * **Why it works:** WhatsApp feels personal, not pushy. Algerian buyers answer it more readily than email or SMS. ### Tactic B: phone call Pick up the phone for your higher-value carts: > *"Hi, I noticed you almost ordered our \[product]. Did you have any questions about delivery, sizes, or payment?"* * **Cost:** operator time per call, which is why you start with the biggest carts * **Why it works:** you hear the actual objection, and you can [convert the cart into an order](#convert-the-cart-straight-into-an-order) while the customer is still on the line instead of asking them to go back and re-order. If price is the objection, offer a small promo on the spot (a [promo code](https://dzbuild.com/dashboard/promo-codes) at -10 %). Don't make this a habit — customers learn to wait for the call. After each message or call, hit **Mark as contacted** on the cart row so your queue always shows who is still untouched. ## Stage 2 — at 24 hours ### Tactic: follow-up message with a promo code DZBuild does not send SMS There is no SMS gateway on any plan, no scheduled abandoned-cart follow-up, and no per-cart recovery link. Everything in this stage is manual: send it yourself from WhatsApp, or from your own external SMS provider. Send a short follow-up 24 hours after abandonment, pointing at your storefront or landing-page URL plus a promo code you created at [`/dashboard/promo-codes`](https://dzbuild.com/dashboard/promo-codes): > *"\[Brand]: lien pour finir votre commande \[votre URL] — code BACK10 pour 10 % de réduction. Valable 24 h."* * **Cost:** operator time, plus your SMS provider's per-message rate if you use one The promo expiry creates urgency without feeling manipulative. Faster still: skip the link and [convert the cart to an order](#convert-the-cart-straight-into-an-order) while you have them on the phone. ## Stage 3 — days 3–7 ### Tactic: Pixel retargeting Run a Facebook/TikTok retargeting ad to visitors who hit `InitiateCheckout` in the last 7 days but didn't `Purchase`. Source the audience from your [Pixel](https://dzbuild.com/docs/marketing/pixels.md) data. Landing pages fire `InitiateCheckout` only on submit Landing pages emit `InitiateCheckout` once, when the buyer submits an order form, and `Purchase` (Meta) / `CompletePayment` (TikTok) when the order succeeds. A visitor who leaves without pressing the order button never fires it, so an audience built on that event leaves those visitors out. If landing pages are your main funnel, retarget on `ViewContent` or on a page-view audience for the `/landing/` URL instead. See the [Landing-page playbook](https://dzbuild.com/docs/advanced/landing-page-playbook.md). * **Cost:** your retargeting CPM, so watch the cost per recovered order in Ads Manager rather than the CPM itself. * **Cap frequency** at 5 per week. Algerian buyers tire fast. Pair with [Facebook Catalog](https://dzbuild.com/docs/marketing/facebook-catalog.md) to show the exact product the customer abandoned. ## Combined funnel The three stages don't compete with each other. A cart you failed to reach by phone in the first hour can still come back from the day-2 message, or from retargeting later in the week. Work them in that order, mark each cart contacted as you go, and read your own recovery rate off the stats bar rather than off anyone's benchmark. ## What kills recovery * **Pushy phone scripts** — *"You haven't ordered yet, why?"* — feels like a salesperson. Customers hang up. Stay friendly and curious. * **Calling at bad hours** — don't call before 10 a.m. or after 9 p.m. local time. * **Bombarding with retargeting** — a customer who said no doesn't want to see the same ad 50 times. Cap frequency at 5/week max. * **Discounts on every recovery** — this trains customers to abandon on purpose. Use sparingly and time-limit them. * **Calling from a new number every time** — Algerian buyers screen unknown numbers. Use a consistent business line. ## Tools you need * [Abandoned carts page](https://dzbuild.com/dashboard/abandoned-carts) — the captured queue * [Pixels](https://dzbuild.com/docs/marketing/pixels.md) with CAPI — for retargeting + accurate attribution * [Facebook Catalog](https://dzbuild.com/docs/marketing/facebook-catalog.md) — for dynamic retargeting ads * A consistent WhatsApp Business number * A staffed phone line during business hours * [Promo codes](https://dzbuild.com/dashboard/promo-codes) — available on **every plan**, but switch the **Promo codes** built-in on at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) first, otherwise the page won't accept codes * **Pro plan or higher** for unblurred phone numbers, mark-as-contacted and convert-to-order ## Measuring effectiveness You don't have to compute any of this by hand. The stats bar at the top of [`/dashboard/abandoned-carts`](https://dzbuild.com/dashboard/abandoned-carts) already shows: * Carts captured (total, today, this week) * Number contacted * Carts still abandoned * Abandoned value * Recovery rate, which counts the carts you marked contacted together with the recovered ones It works on the Free plan too, even though the recovery actions themselves are Pro. Compare week over week and against the previous month — improvements compound. --- Source: https://dzbuild.com/docs/advanced/ai-credits.md # AI Credits AI credits are spent by exactly one feature: the **AI landing-page generator** at [`/dashboard/landing-pages/ai-generate`](https://dzbuild.com/dashboard/landing-pages/ai-generate). New stores start with **no free credits**, so you need to buy a pack before you can generate anything. Credits work on every plan. DZBuild has no AI image generation, background-removal or upscale tool. The AI product-description writer on the product create/edit page costs nothing — see [AI text is free](#ai-text-is-free). Copilot points are a different balance Chatting with [DZBuild Copilot](https://dzbuild.com/docs/copilot/overview.md) is paid for with **Copilot points**, not with AI credits. The two balances are separate: Copilot points belong to your account and every plan receives some each month, while AI credits belong to the store and are only spent by the generator above. If you ask Copilot to generate a complete landing page, it spends that store's AI credits — see [Copilot points](https://dzbuild.com/docs/copilot/points.md). ## Managing your credits Open [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) to see your current balance, transaction history, and available packs. ## Credit packs | Pack | Credits | Price | | ----------- | ------- | ------------- | | Starter | 50 | **500 DZD** | | Standard ⭐ | 150 | **1,200 DZD** | | Pro | 500 | **3,000 DZD** | | Business | 1,500 | **7,500 DZD** | A pack delivers exactly the credits shown — there is no bonus on top. ## How to buy AI-credit packs are paid **instantly by card**, on two rails: * **CIB / Edahabia** through SlickPay, paid in DZD. See [CIB / Edahabia](https://dzbuild.com/docs/payments/cib-edahabia.md). * **Visa / Mastercard**, the global card, accepted worldwide and paid in USD. The global card takes you to a secure payment page that shows the exact USD amount, then brings you back to the AI credits page once the payment is confirmed. 1. Open [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). 2. Choose a pack, then pick **CIB / Edahabia** or **Visa / Mastercard**. 3. Your balance is credited instantly the moment the payment is confirmed. No receipts for credits Unlike plan subscriptions, AI credits do **not** accept a bank transfer / BaridiMob receipt. That rail was closed on 21 July 2026 and now returns an error. Plan subscriptions still accept receipts; AI credits do not. Credits do not expire. ## Cost per generation | Output tier | What you get | Credits | | ----------- | -------------------------- | ------- | | **Medium** | One tall image panel | **20** | | **Tall** | Three stacked image panels | **45** | You pick the tier in the generation wizard: Medium is the **Full page** option (**Page complète** / **صفحة كاملة**) and Tall is the **Long page** option (**Page longue** / **صفحة طويلة**). The Long page option disables itself when your balance can't cover 45, so a balance of 20 to 44 credits still lets you generate a Full page. ## AI text is free The AI product-description writer on the product create/edit page costs **0 credits** on every plan. It is capped by rate limits instead: * 6 generations per minute per store * 150 generations per day per store * 3 generations per product per day ## Before you generate Two prerequisites are checked **before** any credits are taken. If either fails, generation is refused and nothing is charged: 1. **A product with at least one photo.** Pick a real product that already has an uploaded image — a page generated without one is refused. 2. **A free landing-page slot.** Credits alone are not enough. Landing-page slots come with your plan and are not sold separately, so a Free-plan store has none and has to subscribe first. Pro is capped at **3 landing pages in total**, so a 4th generation is refused even with a full credit balance. See the [Landing-page playbook](https://dzbuild.com/docs/advanced/landing-page-playbook.md). ## What if generation fails? * **Provider unavailable** — if the AI provider is unreachable, generation is refused with a `provider_unavailable` error and you are not charged. * **Double submit** — a second generation launched while the first is still running is blocked and refunded automatically. * **Stalled run** — a generation that hasn't finished after about 10 minutes is marked stale and refunded automatically. * **Failed run**: a generation that fails after it started is refunded in full automatically. * **Partial Tall page**: if a Tall page comes back with fewer than three panels, the share of the missing panels is refunded (15 credits per missing panel). Refunds appear as their own row in the transaction history on [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). ## Limits * **Balance ceiling.** A store's credit balance has an upper limit, far above the largest pack. A purchase that would push you past it fails outright rather than partially crediting: no credits are added and the purchase is left unfinished, so contact support if a payment went through against the cap. * **10 AI generations per minute** per store. ## No plan includes AI credits No plan bundles AI credits, Enterprise included. The monthly Enterprise allocation of 100 credits was withdrawn in August 2026 and no longer runs, so every credit now comes from a pack you buy on [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). Credits you already bought are unaffected: they stay on the store and do not expire. --- Source: https://dzbuild.com/docs/advanced/checkout-conversion.md # Checkout conversion optimization Your checkout is the most important page in your store. Every percentage point of lift is real money. Here's what works specifically in the Algerian market. ## Benchmarks These are external reference figures for the Algerian market, not numbers DZBuild reports: | Stage | Algerian average | Top quartile | | -------------------------- | ---------------- | ------------ | | Visitor → ViewProduct | 30–50 % | 60 %+ | | ViewProduct → AddToCart | 8–15 % | 20 %+ | | AddToCart → Checkout | 50–70 % | 80 %+ | | Checkout → Confirmed order | 50–70 % | 80 %+ | There is no funnel chart in DZBuild DZBuild's own [analytics](https://dzbuild.com/docs/marketing/analytics.md) do not break traffic down per funnel stage. What you get on the dashboard is a set of KPI tiles (revenue, orders, average order value, visitors and a single conversion-rate figure), revenue and visitors over time, orders by hour and by status, top products, device breakdown, traffic sources and top wilayas. For real per-step funnel data, use your [Pixel](https://dzbuild.com/docs/marketing/pixels.md)'s Events Manager. Enterprise stores with the Advanced Analytics addon also get a link out to a hosted analytics dashboard that includes funnel reports. ## Top levers, ranked by impact ### 1. Turn on Fast Checkout The biggest lever is not optimizing the checkout page — it's skipping it. **Fast Checkout** puts the order form directly on the product page, so a buyer can order without ever reaching `/checkout`. Configure it in **Customize → Product page**: * Show / hide the Fast Checkout form (on by default) * Custom form title * Hide the address field * Single-column layout * Show the order-notes field It is also a reorderable product-page section, so you can move it above the description. Fast Checkout is on by default on every plan. Hiding it and changing its title, button text or colours need the **Pro plan or higher**; the address, single-column and notes toggles work on every plan. This is the top lever because it removes a whole page from the path between "I want it" and "order placed". ### 2. Show "Cash on Delivery" prominently Algerian buyers trust COD. Show the badge above the fold and in the cart. Don't bury it in fine print. ### 3. Reduce form fields Every field you ask for is one more reason to give up. On DZBuild's checkout, name, phone, wilaya and commune are always required; **email is already optional by default**. Three toggles in **Customize → Checkout** (**Pro plan or higher**) remove fields entirely: * **Hide email** * **Hide address** * **Hide notes** The address field also stops being required by itself the moment the customer picks desk delivery (or a pickup point), so you don't have to hide it for desk-heavy stores. Whether a home order needs an address at all is a switch: on the product-page form it is off by default (**Require the address** under the hide-address switch in Customize → Product page), on the checkout page it is on by default (same place, Checkout page section). Both are enforced when the order is saved, not only in the browser. ### 4. Keep your shipping rates and delivery estimates accurate Checkout already shows the shipping cost the moment a wilaya is picked, along with the delivery-days estimate — there is nothing to enable. What you control is at [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping): the home and desk price per wilaya, whether each delivery type is available per wilaya, and the delivery-days estimate that renders next to it. Wrong numbers there are what surprises customers at the last step. Use [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) if your products have very different shipping costs. One more number to know about: if a product carries a weight, the courier's own weight surcharge is applied on top of your wilaya rate. That rule belongs to the courier, DZBuild only applies it. If you do not want it on a given product, leave that product's weight empty or set free shipping on it. ### 5. Run AR + FR Make sure your checkout copy is in both languages with the [Multi-Language add-on](https://dzbuild.com/docs/addons/multi-language.md) (**Unlimited plan**). ### 6. Offer stop-desk delivery, and pickup if you have a shop Plenty of Algerian buyers would rather collect from a desk than wait at home. Without a desk option you lose them. Activate the [Stop Desk add-on](https://dzbuild.com/docs/addons/stop-desk.md) for the structured picker. If you have a physical shop, the **Pickup from Store** addon adds a third delivery option beside home and desk: customers in the wilayas you cover collect the order from your address with **no delivery charge at all**. It shows up at checkout, on the product page and on landing pages. Requires the **Unlimited plan**. ### 7. Add reviews A product page with no reviews at all gives a first-time buyer nothing to go on. Activate the [Product Reviews add-on](https://dzbuild.com/docs/addons/product-reviews.md) and get the first few in place. ### 8. Guest checkout — already the only option DZBuild storefronts have **no customer accounts at all**, so a forced login is impossible. There is nothing to check and nothing to switch off. ### 9. Raise AOV with Cross-Sell The real add-on-value lever is **Cross-Sell — Frequently Bought Together** (**Pro plan and above**). It fires **after** the order is submitted: the customer sees a "frequently bought together" popup, taps + on a product, confirms, and it is added directly to the same order — which you then confirm with them by phone. Related products can be set per product manually or auto-related by category and best sellers. Note that the [Offer Variant Popup add-on](https://dzbuild.com/docs/addons/offer-variant-popup.md) is **not** an upsell — it only turns the cramped per-piece variant selector for multi-quantity offers into a modal. It belongs in the mobile/UX lever below. ### 10. Optimize for mobile Most of your traffic arrives on a phone. Check the device breakdown on your dashboard for your own split, then test on a real phone rather than a desktop preview: * Buttons ≥ 44px tall * No horizontal scrolling * Form fields use `tel` for phone, `email` for email * Photos load fast (the [Image Cadre add-on](https://dzbuild.com/docs/addons/image-cadre.md) helps) * Use the [Offer Variant Popup add-on](https://dzbuild.com/docs/addons/offer-variant-popup.md) so multi-piece variant pickers aren't cramped on a phone ### 11. Speed Pages must load in under 2 seconds on 4G. Run [PageSpeed Insights](https://pagespeed.web.dev). Heavy images are usually the culprit; DZBuild serves optimized WebP images automatically, which handles most of this. ## What backfires in Algeria * **Free shipping above threshold** — Algerian buyers compare absolute prices. They'd rather see *5000 DZD + 0 shipping* than *4500 + 500*. Set product prices accordingly. * **Countdown timers on the cart** — feels manipulative. The [countdown urgency](https://dzbuild.com/docs/addons/overview.md#always-on-built-ins) built-in is best used as a low-key banner, not a screaming popup. * **"Only 2 left in stock" warnings** — works in some markets, eye-roll in Algeria. Use sparingly, ideally only when actually true. * **Pop-up newsletter signups** — Algerians don't open marketing emails much. Skip. Card payment isn't a choice you make On a physical store, DZBuild's checkout is **COD-only by construction**: there is no payment selector to get wrong. SlickPay, which you use to pay for your own subscription and AI credits, never appears at a physical store's checkout. Only digital-product stores get buyer payment methods, configured at [`/dashboard/digital/payment`](https://dzbuild.com/dashboard/digital/payment): manual CCP / BaridiMob / RedotPay transfers, with or without a receipt upload, or CIB / EDAHABIA card payment through your own Slick-Pay account. ## Trust signals that work * Verified-purchase reviews ([Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md)) * COD badge near the order button * Real photos of your products (not stock images) * Phone number visible in the footer * Wilaya-specific delivery time on the cart page ## Filtering fake and bot orders Fake orders don't hurt conversion, they hurt your courier return rate — but they come from the same checkout, so handle them here: * **[Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md)** (**Pro plan**): a bot check on every order form. Only the default **Normal** level is invisible to customers. **High** also blocks VPN / proxy / Tor visitors, and genuine buyers have been rejected on it, so if you switch to High, watch your order count and go back to Normal the moment it drops. The **Aggressive** level shows the customer a challenge to solve at submit time, which is a real conversion cost, so only use it while under attack. * **[Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md)** (free) — caps how many orders one IP can place in a time window. Stops repeat prank orders. * **Minimum & Maximum Quantity Per Product** (free) — per-product min/max order quantity, enforced on the storefront, fast checkout and landing pages. Stops absurd-quantity orders that waste courier slots. ## Measuring changes Run **one change at a time**. For checkout and product-page changes, test sequentially: ship the change, leave it running a full week, then compare against the previous equivalent week using the dashboard KPI tiles or your Pixel data. Algerian traffic skews to weekends, so a Tuesday-to-Thursday sample is biased. Always compare whole weeks. Landing pages are the exception. The [A/B Testing add-on](https://dzbuild.com/docs/addons/ab-testing.md) (**Pro plan**) gives you a real traffic splitter: it rotates visitors of one test link between 2 to 5 landing pages, counts the orders each one produced, and sends everyone to the winner once you pick it. Checkout itself has no splitter, so the sequential method above is what you have for the rest of the store. Watch: * Conversion rate and orders (dashboard KPI tiles) * AOV (for cross-sell and offer-related changes) * Mobile vs. desktop conversion (device breakdown) * Per-step drop-off in your [Pixel](https://dzbuild.com/docs/marketing/pixels.md)'s Events Manager ## Resources * [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md) — filters bots and fake orders (Pro) * [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) — caps orders per IP (free) * [Multi-Language](https://dzbuild.com/docs/addons/multi-language.md) — AR + FR storefront * [Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md) — trust signals * [Offer Variant Popup](https://dzbuild.com/docs/addons/offer-variant-popup.md) — cleaner multi-piece variant picker * [Stop Desk](https://dzbuild.com/docs/addons/stop-desk.md) — desk pickup picker * [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) — per-product shipping overrides --- Source: https://dzbuild.com/docs/advanced/landing-page-playbook.md # Landing-page playbook This is the structure Algerian merchants keep coming back to for cold paid traffic. Use it as a starting template, then iterate on your own numbers. ## Landing pages vs. product pages DZBuild has both. They serve different purposes: | Use a **product page** when… | Use a **landing page** when… | | ---------------------------------- | ---------------------------------------------- | | You're selling a catalog | You're running paid ads to one product | | Customers browse multiple products | Each campaign is one product, one offer | | You rely on category pages | You want full creative control over the layout | | SEO traffic matters | Ads are the only source | You can run both in parallel — landing pages for paid, product/category pages for SEO and direct traffic. ## Plan limits Landing pages are gated by plan: | Plan | Landing pages included | Notes | | -------------- | ---------------------- | --------------------------------------------------- | | **Free** | 0 | No landing pages on the Free plan. | | **Pro** | **3** | 3 landing pages **in total**, not 3 published ones. | | **Unlimited** | unlimited | Spin up as many as you need. | | **Enterprise** | unlimited | Same as Unlimited. | The Pro limit counts every row on [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages), drafts and AI-generated pages included. Deleting an unused draft is what frees a slot. Landing pages are not sold one at a time. They come with the plan, and the AI generator spends [AI credits](https://dzbuild.com/docs/advanced/ai-credits.md) rather than a separate page fee. ### What happens when a paid plan expires When a paid plan expires: * **Your storefront goes offline.** Your home, product, category and checkout pages show a "Store Unavailable" page. About 12 hours after expiry your custom domain is also unlinked, so an ad still pointing at `/landing/{slug}` on that domain is paying for a dead page. * **Most of the dashboard is locked.** Only the dashboard home and the subscribe, account, settings, notifications, affiliate, AI credits and domains pages stay open. [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages) sends you to [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) until you renew, so you cannot edit, create or delete anything in the meantime. * **Nothing is deleted.** Renew and every page comes back exactly as it was. Only the custom domain has to be connected again, from [`/dashboard/domains`](https://dzbuild.com/dashboard/domains). Renewal: [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), then the **▶ How to renew** in-app guide, or [DZBuild YouTube](https://www.youtube.com/@DZBuild-off). ## Two ways to build a page | | **Build it yourself** | **Generate it with AI** | | -------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | Where | [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages) → Create landing page | [`/dashboard/landing-pages/ai-generate`](https://dzbuild.com/dashboard/landing-pages/ai-generate) | | You get | An **empty** page you fill section by section | Ready-made image panels with Algerian Darija copy plus a themed order form | | Cost | Free (uses a plan slot) | 20 AI credits (Medium, 1 panel) or 45 (Tall, 3 panels), plus a plan slot | | Language | Arabic / RTL | You choose it in the wizard | The AI generator has two prerequisites, both checked **before** any credits are taken — if either fails, nothing is charged: 1. A product that already has **at least one uploaded photo**. 2. A **free landing-page slot** on your plan. See [AI Credits](https://dzbuild.com/docs/advanced/ai-credits.md) for pricing, refunds and limits. Page language A landing page carries its own language, independent of your store language — it also sets the text direction. Today you can only choose it in the AI-generation wizard (or through the public API). A page you build by hand in the editor is Arabic / RTL, and there is no control to change it afterwards. ## Setting up a landing page 1. Open [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages) → **Create landing page**. You pick the product the page sells, which is required, then fill in a title, an optional slug (left empty, one is generated from the title) and an optional short description. That's the whole form. 2. Pick the product the page sells (see the warning below — this matters for shipping). 3. Build the page section by section. **There is no template gallery**: the new page is created empty and drops you straight into the section editor. Add sections one by one from the **Add section** picker. 4. Customize copy, photos and colors. The editor renders the **real storefront page live** in the preview panel, so check the mobile layout there rather than opening the public URL. Previewing doesn't count as a page view, doesn't fire your pixels and can't create orders. 5. Assign your campaign [Pixel](https://dzbuild.com/docs/marketing/pixels.md) at [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels) — see [Pixel + tracking](#pixel--tracking) below. 6. There is no separate publish step. A page you create in the dashboard is live at its URL as soon as it is created, and your saved edits show there. The landing page lives at `/landing/{slug}` on your storefront domain (note: `/landing/`, not `/lp/`). Always pick a real product A landing page with no product still charges the **base per-wilaya shipping rate** — shipping is not zero. What it silently loses is the **weight surcharge**, the [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) override, and the Min/Max Quantity rules. So a heavy product, or one with a per-product shipping override, gets undercharged compared to its own product page. A page you create in the dashboard always has one: the create form requires a product, and the editor lets you switch the page to another product but not remove it. Older pages, and pages created through the API, can still have none; the landing-page list flags them with a badge and a link to attach a product in the page settings. The **order form**, **order button** and **product offers** sections also carry their own product picker, and a section's product overrides the page-level one. ## The section catalogue These are the section types you can add in the editor: | Section | What it does | | ------------------ | ---------------------------------------------------------------- | | Image | A single full-width image | | Image carousel | A swipeable set of images | | Announcement bar | A thin banner strip | | Special offer | A highlighted offer block | | Price display | Price with optional strikethrough and discount badge | | **Product offers** | Quantity bundles ("buy 2", "buy 3") with per-offer free shipping | | **Order form** | The order form itself, with a buy button | | Order button | A buy button, optionally with the form attached | | Free text | Rich text — use this for your FAQ | | Contact button | WhatsApp / phone contact | | Countdown | A countdown timer | | Fake visitors | A live-viewers counter | | Testimonials | Customer reviews block | | Custom form | Lead capture; answers are appended to the order notes | **Product offers** is the main AOV lever on landing pages. Quantity bundles are priced **server-side**, so the total the customer sees is always the total they are charged, and an offer can carry its own free shipping. The **order button** can also be set to follow the offers, mapping the chosen quantity to the matching offer price automatically. ### Order-form behaviour An order form or order button has four behaviours, chosen in its settings: * **Link-only button** — no form, the button just links * **Button + form, tap to open** * **Button + form already open** — the default for **new** order-form sections * **Form always open, no button** — the old default Defaults apply at creation only and are never back-filled, so older sections keep the behaviour they were created with. Note that the order summary renders **below** the submit button, not above it. ## The 7-block structure ### 1. Hero (above the fold) * **Big product photo** — real, not stock. Mobile-first. * **One-sentence headline** with benefit + price (*"X premium bag for 1900 DZD only — delivered everywhere"*). * **CTA button** — scrolls to order form. Color contrasts with the background. ### 2. Benefits (3–5 bullets) Three to five benefit lines max. Use icons: * 🚚 Cash on delivery, in the wilayas you actually cover * ⭐ Your real review score, if you have one * 🔄 Your return window Write these from your own store. A delivery or returns promise you cannot keep is what produces refused parcels. ### 3. Product showcase * 4–6 lifestyle photos * 1 short video if you have one (15s autoplay loop, no sound) ### 4. How it works / What's in the box * 3 steps for "how it works" products * A list of contents for "what's in the box" ### 5. Reviews / testimonials Use the **Testimonials** section. * 3–5 reviews with photos * Real names + locations (*"Sarah, Algiers"*) * Mix of 4 and 5 stars (all-5 looks fake) * Source from real reviews captured by [Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md) ### 6. FAQ There is **no FAQ or accordion section type** — write the FAQ inside a **Free text** section. * 5–8 questions, as plain question/answer text * Cover: shipping cost per wilaya, return policy, delivery time, COD, sizing, warranty ### 7. Order form * Use an **Order form** section (or an **Order button** with the form attached) * The CTA buttons throughout the page scroll here — so if you leave the form always open with no button, there is nothing for them to scroll to * Required: name, phone, wilaya, qty * Optional: variant pickers (color/size — use the [Offer Variant Popup add-on](https://dzbuild.com/docs/addons/offer-variant-popup.md) for multi-piece offers) * **Submit order** button — large, prominent, with the order summary directly beneath it * COD trust badge below ## Copy guidelines * **Arabic** — warm, friendly, conversational. Avoid formal Modern Standard Arabic for casual products; mix in colloquial Darija for relatability. * **French** — clear and direct. Don't translate Arabic literally; rewrite for French sensibility. * **Avoid superlatives** — *"the best ever"*, *"world-class"*. Algerian buyers are sophisticated; superlatives signal "marketing speak." ## Pricing tactics | Tactic | When to use | | -------------------------------- | ----------------------------- | | Strikethrough was/now | High-perceived-value items | | Bundle pricing | Cross-sell ("Buy 2 + 1 free") | | Free shipping for offers ≥ X DZD | High-AOV products | | Plain price | Premium products, simplicity | ## Pixel + tracking Install [Facebook Pixel + CAPI](https://dzbuild.com/docs/marketing/pixels.md) first. The events themselves are automatic — there is nothing to configure on the landing page: | Event | When it fires | | ---------------------------------------------- | --------------------------------------------------------------- | | `ViewContent` | On page load | | `InitiateCheckout` | Once per order form, when the buyer submits it | | `Purchase` (Meta) / `CompletePayment` (TikTok) | On a successful order from the order form | | `Lead` / `SubmitForm` / `generate_lead` | Only from a **Custom form** section — never from the order form | Landing pages emit `InitiateCheckout` only when the buyer submits an order form, so a retargeting audience built on that event leaves out every visitor who never pressed the order button. Retarget on `ViewContent` or a page-view audience for the `/landing/` URL instead; see [Abandoned cart strategy](https://dzbuild.com/docs/advanced/abandoned-cart-strategy.md). ### Assigning a Pixel to the page Pixel assignment is **not** part of landing-page setup and it is not an "override". Go to [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels), open the pixel and assign it to the landing page. The rule is: * A pixel with **no** assignments is global and fires everywhere. * A pixel **with** assignments fires only where one matches. Global pixels still fire alongside an assigned one, so a campaign pixel is **added**, never substituted. Once you have 50+ purchases, switch your campaign to **Optimize for Purchase** — Meta moves the algorithm to optimize for buyers, not lookers. ## Testing variants The [A/B Testing add-on](https://dzbuild.com/docs/addons/ab-testing.md) (**Pro plan**) is the built-in way to do this. You give it 2 to 5 landing pages, it hands you one test link, and it rotates arriving visitors between the pages, counts the orders each one produced, and lets you send all remaining traffic to the winner. Point your ad at the test link instead of at a page URL. The add-on is managed at [`/dashboard/ab-tests`](https://dzbuild.com/dashboard/ab-tests). If you would rather keep the split inside Facebook or TikTok: 1. Build the second page. There is no duplicate button on [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages), so you create a new page and rebuild its sections. Inside the editor you can copy an individual section. 2. Give each page its own slug. 3. Point a separate ad set at each URL, so the split happens in the ad platform. Keep a clean naming convention across the two pages: * `LP-X-control` — original * `LP-X-test1` — testing one change * `LP-X-test2` — testing another change Don't change two things at once, or you won't know which one won. Remember that each extra page consumes a landing-page slot. ## Speed Mobile load time is the conversion killer: * ≤ 1 s = ideal * 1–2 s = ok * 2–3 s = losing 30 %+ of visits before they see the page * 3 s+ = mostly wasted ad spend Compress hero images aggressively (WebP, ≤ 200 KB). Lazy-load below-fold. The [Image Cadre add-on](https://dzbuild.com/docs/addons/image-cadre.md) helps frame photos correctly, and WebP versions are served automatically. ## Audience matching A landing page is only as good as the traffic. Match the audience to the offer: * **Wide audience** for low-price impulse products (perfumes, accessories) * **Narrow lookalike** for higher-price considered products (electronics, fashion) * **Retargeting** for cart abandoners — see [Abandoned cart strategy](https://dzbuild.com/docs/advanced/abandoned-cart-strategy.md) ## When to clone vs. build new * **Reuse the structure** of an existing high-converter when you adapt it to a new product in the same category. There is no whole-page copy in the dashboard, so you create the new page and rebuild its sections; the section copy icon inside the editor saves some of that work. * **Start from scratch** when you change market segment or core messaging. ## Common mistakes * **Linking to your storefront from the landing page** — sends customers down a rabbit hole. Don't. * **Multiple CTAs going to different places** — one CTA, one destination (the order form). * **Tons of text** — most readers scan, not read. Keep block copy short. * **No variant pickers** — if your product has variants, the customer needs to choose them on the page. * **No product selected** — the base per-wilaya shipping still applies, but the weight surcharge, the Custom Product Shipping override and the Min/Max Quantity rules are all skipped. Always pick a real product, at page level or on the order-form / order-button / product-offers section. * **Forgetting to assign the campaign Pixel** — an unassigned campaign pixel simply doesn't fire on the page, so the campaign records nothing. Assign it at [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels). * **Writing the FAQ as a section that doesn't exist** — there is no FAQ/accordion type; put it in a Free text section. --- Source: https://dzbuild.com/docs/copilot/design-assistant.md # Design your store with the AI assistant The design assistant lives inside the Customize page. You describe your business in a few words, and it picks the colours, the font, the texts and the home page sections of your store, then changes them while the preview shows the result. Afterwards you keep writing to it: "darker colours", "a bigger buy button", "add a questions section". It spends your [Copilot points](https://dzbuild.com/docs/copilot/points.md), and each change in its latest reply has its own undo button. ## Where to find it In the dashboard sidebar, open **Personnaliser la boutique / تخصيص المتجر**, then **Personnaliser / تخصيص** ([`/dashboard/customize`](https://dzbuild.com/dashboard/customize)). On a computer, the **Assistant IA / المساعد الذكي** button sits at the top of the settings column. On a phone, it is the **Assistant / المساعد** button in the bottom row, next to **Enregistrer les modifications / حفظ التغييرات**. The assistant opens in the settings column. ## Describe your store The first time, the assistant asks you to describe your store. Write what you sell and the feel you want, in Arabic, Algerian darija or French, for example *"children's clothes, cheerful and soft colours"*, or tap one of the examples under the box. Then tap **Créer mon design / صمّم متجري**. A first design sets a palette and a font that suit your business, the hero and block titles, the button style, large buy buttons, an announcement about payment on delivery on Pro and above, and up to three home page sections for your main categories, with a trust section and a short questions section when your plan has room for them. It keeps your theme and the sections you already have. It usually takes under a minute, and a whole store can take up to a minute and a half. After that the panel is a chat. Write one change at a time, and the assistant answers in your language in one or two short sentences. If the Customize page has unsaved edits, they are saved before the assistant starts. Its own changes are saved at once: you do not need to save after it. ## Example pictures Tap **Image d’exemple / صورة مثال** to attach up to 3 pictures, for example a store or a product whose look you like. The assistant takes the mood, the colours and the layout idea from them. It does not copy their text, logos or prices into your store. A picture must be at least 200 pixels wide and tall and under 8 MB, in JPG or PNG. ## What a message costs Each message spends Copilot points from the same balance as the Copilot chat. The panel shows your balance next to **Points / النقاط**, and tapping it opens the points page. Typical costs: | Message | Roughly | | --------------------------------------- | -------------- | | A small change, such as new colours | 1 to 2 points | | A whole-store design from a description | about 4 points | A message with pictures costs a little more, because the pictures are read too. If you have never opened Copilot, the assistant uses this month's grant of your plan. To buy more points, open Copilot once so your balance exists, then buy a pack on the [points page](https://dzbuild.com/docs/copilot/points.md). The balance in the panel counts your last message at once; the points page can take a few minutes to catch up. ## Undo a change Under each reply that changed something, a **Ce qui a changé / ما تغيّر** list shows one line per change: colours and texts, home page sections, theme, order form style or variant style. Tap **Annuler / تراجع** on a line and that change goes back the way it was, in the preview and on your store. Only the latest list has undo buttons, and a new conversation starts with none. ## It changed something I did not want 1. Tap **Annuler / تراجع** on that line of the latest **Ce qui a changé / ما تغيّر** list. 2. If the line has no button any more, tell the assistant what you want back, for example *"put the old green back"*, or change it yourself in the sections of the Customize page. 3. If you added, moved or removed home page sections after that change, its undo is refused and the panel says so. Ask the assistant for the layout you want. Do not use the **↺ Reset** button for this: it resets the whole store and deletes your uploaded images. See [Storefront customization](https://dzbuild.com/docs/storefront/customization.md). ## When visitors see the change The preview shows the change as soon as the assistant answers. Visitors see it on your live store within about 5 minutes, the same delay as any change made in Customize. ## Who can use it | | | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | **Plans** | Every plan. Fields your plan locks stay locked: the assistant tells you which plan opens them. | | **Team members** | Members with the **Personnaliser la boutique / تخصيص المتجر** permission. A team member spends their own Copilot points, not the owner's. | | **Stores** | The store selected in your dashboard. | ## What it does not change The assistant changes the look and the words of your store, nothing else. It does not touch products, prices, photos, stock, orders, delivery prices or couriers. It does not change your store name, your logo, the hero pictures, the store language, pixels, promo codes, domains, landing pages, custom CSS or JavaScript, or the DZBuild branding in the footer. It does not move your store to or from the Digital theme: do that from the Themes page. For each of these, the assistant tells you where to go. ## What's next * [Storefront customization](https://dzbuild.com/docs/storefront/customization.md): every control of the Customize page * [Copilot points](https://dzbuild.com/docs/copilot/points.md): grants, packs and your balance * [What DZBuild Copilot can and cannot do](https://dzbuild.com/docs/copilot/what-it-can-do.md): what Copilot changes beyond the design --- Source: https://dzbuild.com/docs/copilot/overview.md # DZBuild Copilot — the AI that runs your store **DZBuild Copilot** is an AI assistant that lives inside your dashboard and does the work for you. You describe what you want in plain Arabic, Algerian darija, French or English, for example *"add this product", "build me a landing page for it", "set my delivery prices for the south"*, and Copilot carries it out in your store while you watch. It is included on **every plan** and you open it from [`/dashboard/copilot`](https://dzbuild.com/dashboard/copilot). That is the difference worth stating up front: a chatbot tells you where to click. Copilot clicks. ## If you are a busy merchant, read this part Most merchants lose their evening to the same five jobs: entering a product, writing its description, cropping and uploading photos, building a landing page for the ad, and fixing delivery prices wilaya by wilaya. Copilot collapses all of that into typing. Send it a photo of the product from your phone and write *"add this product, price 3,500 DZD, and put this photo on it"* — the product exists, with that exact photo on it, before you have finished your coffee. Then *"now make me a landing page for it and publish it"*. Then *"set home delivery at 600 DZD everywhere and 400 for stop desk"*. You never open a form. You stay in charge the whole time: Copilot tells you what it is about to change, does it, and tells you what it did. If you do not like the result, you say so and it fixes it. ## Opening Copilot 1. Sign in to your dashboard and select the store you want to work on. 2. Click **Copilot** in the sidebar — the entry with the green **new** badge. 3. You land in the chat already signed in. There is no second account to create, no password, no API key and nothing to install. Copilot opens on the store selected in your dashboard, and the store button at the top of the chat shows which store it is working on. If you own several stores, pick another one from that button and a new conversation starts on that store. Switching store in your dashboard moves Copilot to that store too. ## The language it speaks The first screen opens in **English**. Use the language menu at the top of the chat — **العربية · Français · English**, each written in its own language — and pick yours once; the choice is remembered on that device. Copilot answers in the language you write in. Write in Algerian Arabic and it answers in Algerian Arabic — you do not need to write formal Arabic to be understood. ## Who can use it | | | | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Plans** | Every plan, including the 3-day Pro trial. There is no AI tier to buy. | | **Who** | The store owner. Staff accounts can use the dashboard normally, but Copilot's store actions are owner-only. | | **Stores** | Every store you own, one at a time. Copilot opens on the store selected in your dashboard, and the store button at the top of the chat switches it and starts a new conversation. | | **Expired plan** | The Copilot links disappear from the sidebar until you renew. | ## What it costs Conversations are metered in **Copilot points**. Every plan gets points added automatically at the start of each month, you get 20 welcome points the first time you open the chat, and you can buy more. A normal message costs roughly 1 to 2 points. Points never expire, and they are **not** the same thing as AI credits. See [Copilot points](https://dzbuild.com/docs/copilot/points.md) for the full picture. ## Copilot is not the Claude add-on Merchants often confuse Copilot with the add-ons that plug their own AI into their store. The table compares it with the Claude add-on; the [ChatGPT add-on](https://dzbuild.com/docs/addons/chatgpt.md) works the same way for ChatGPT and Codex. They are genuinely different products: | | **DZBuild Copilot** | **[Claude add-on](https://dzbuild.com/docs/addons/claude.md)** | | ------------------- | ----------------------------------- | -------------------------------------------------------------- | | What it is | An assistant DZBuild hosts for you | A connector that plugs **your own** Claude into your store | | Where you use it | Inside your dashboard | Inside claude.ai, Claude Desktop or Claude Code | | Plan needed | Every plan | Enterprise, with the add-on activated | | Setup | None — click and chat | Add a connector URL and approve it | | Who pays for the AI | Copilot points, bought from DZBuild | Your own Claude subscription | If you already pay for Claude and live in it all day, use the add-on. If you just want the work done, use Copilot. ## Honest limits * **Orders are priced by your store, never by the chat.** Copilot can take an order, change its status, cancel it and hand it to your courier, and a courier send only goes through after you approve a summary naming the customer and the total. What it cannot do is set a price. See [what Copilot can and cannot do](https://dzbuild.com/docs/copilot/what-it-can-do.md). * **Not everything can be undone.** Settings changes can be reversed by asking; products, photos and variants cannot. * **It does not remember you.** Each conversation starts fresh — nothing is carried between chats. * **Facebook and Instagram ad accounts are not connected yet.** TikTok Ads can be connected inside the chat with your own TikTok login. * **It can be wrong.** It reads your store live and asks before touching money, but you are still the merchant — read what it tells you before saying yes. ## What's next * [What Copilot can and cannot do](https://dzbuild.com/docs/copilot/what-it-can-do.md) — the full list, and the safety rules * [What to ask Copilot](https://dzbuild.com/docs/copilot/what-to-ask.md) — real sentences that work, for each job * [Copilot points](https://dzbuild.com/docs/copilot/points.md) — grants, packs and what a message costs --- Source: https://dzbuild.com/docs/copilot/points.md # Copilot points **Copilot points** are what your conversations with [DZBuild Copilot](https://dzbuild.com/docs/copilot/overview.md) are metered in. Every plan receives points automatically each month, the first 20 land the moment you open the chat, and you can buy more at [`/dashboard/copilot/points`](https://dzbuild.com/dashboard/copilot/points). Points are **not** AI credits. They are two separate balances that pay for two different things — see [the comparison below](#points-vs-ai-credits). ## What a point buys A point is one unit of conversation. In practice: | Message | Roughly | | --------------------------------------------------------------------- | --------------------------------------------------------- | | A normal question or a small change | 1 to 2 points | | A job with several steps — set up a store, build a whole landing page | more | | A web search, or a document you attached | more, because everything you send enters the conversation | Copilot's reply, the work it does in your store, and anything you attach are all metered on the same balance. Your balance is shown with one decimal, so partial use is visible. The [design assistant](https://dzbuild.com/docs/copilot/design-assistant.md) in Customize spends the same points. ## What you get free, every month Points are added **automatically at the start of each month**, based on the best plan among the stores you own, and paid stores add up: | Plan | Points per month | | ---------- | ---------------- | | Free | 20 | | Pro | 40 | | Unlimited | 60 | | Enterprise | 150 | The 20 welcome points come out of that month's grant The first time you ever open Copilot, 20 points are credited straight away so you can start without waiting for the monthly grant. They are taken out of that grant rather than added on top of it: a Pro store that received the 20 welcome points gets the remaining 20 when the grant lands, for 40 that month. Points accumulate — they are never reset The monthly points are added to what you already have; they do not replace it. Nothing expires. If you did not use last month's points, they are still there. ## Buying more | Pack | You pay | You get | | --------------------------- | --------- | ------------------------------ | | **Starter** | 400 DZD | 40 points | | **Standard** — most popular | 1,000 DZD | 120 points **+10 free = 130** | | **Pro** | 2,200 DZD | 300 points **+30 free = 330** | | **Business** | 5,000 DZD | 800 points **+100 free = 900** | 1. Open [`/dashboard/copilot/points`](https://dzbuild.com/dashboard/copilot/points) from the sidebar. 2. Pick a pack and click **Buy**. 3. In the window that opens, enter a promo code if you have one, pick **CIB / EDAHABIA** or the global card (Visa / Mastercard / PayPal, paid in USD), then click **Pay now**. There is no bank transfer or receipt upload for points. Points are added automatically a few minutes after the payment settles. While that is happening the purchase shows as *paid — being added* in your purchase history on the same page; once it lands the row reads *added*. A point you buy arrives as a whole point. There is no conversion and no fee taken out of it. ## Reading your balance The points page shows your balance, the plan your monthly grant is based on, the time it was last updated, and your last ten purchases. The number is a snapshot that refreshes regularly, so it can lag your very latest message by a few minutes. If the balance shows a dash instead of a number, you have never opened Copilot on that account — open the chat once and the balance appears. ## When you run out Copilot pauses and shows a message with a link back to the points page. Nothing is lost: * Your conversations stay exactly where they are. * Your store is untouched — anything already done stays done. * Buy points and continue in the same chat. There is no automatic top-up and no charge you did not choose. Copilot simply stops until you refill it. ## Points vs AI credits DZBuild has two AI balances. They are not interchangeable. | | **Copilot points** | **[AI credits](https://dzbuild.com/docs/advanced/ai-credits.md)** | | ------------ | --------------------------------------------------------------------------- | ------------------------------------------------------------------- | | Pay for | Conversations with Copilot | The AI landing-page generator | | Scope | Your **account** — one balance for all your stores | **Per store** — credits on one store cannot be spent on another | | Free monthly | Yes, on every plan (20 / 40 / 60 / 150) | None on any plan, you buy a pack | | Typical cost | 1 to 2 points per message | 20 credits for a medium page, 45 for a tall one | | Where to buy | [`/dashboard/copilot/points`](https://dzbuild.com/dashboard/copilot/points) | [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) | Asking Copilot to generate a landing page spends AI credits Building a landing page section by section through Copilot costs only points. Asking it to **generate** a complete page with AI spends that store's AI credits on top. Copilot tells you before it starts, and a failed generation refunds the credits. ## Frequently asked questions **Q: Do I need to buy points to use Copilot?** A: No. Every plan receives points every month, and the first 20 are credited as soon as you open the chat. Packs are for merchants who want more. **Q: Do points expire?** A: No. Monthly points and bought points stay in your account until you spend them. **Q: Are points per store or per account?** A: Per account. One balance covers every store you own. **Q: I own several stores on different plans. Which grant do I get?** A: Your paid stores add up. Two Pro stores that both pay a subscription earn both grants into the one balance. Stores on the free plan and stores still in the trial do not add a grant of their own, and you always receive at least the grant of your best plan, so a single store is unaffected. **Q: Can I pay for points by bank transfer or with an international card?** A: Not by bank transfer. The points page takes instant payment by CIB / Edahabia card or by global card (Visa / Mastercard / PayPal, paid in USD). **Q: My plan expired. What happens to my points?** A: The points stay on your account, but Copilot disappears from the sidebar until you renew. ## What's next * [What Copilot can and cannot do](https://dzbuild.com/docs/copilot/what-it-can-do.md) * [What to ask Copilot](https://dzbuild.com/docs/copilot/what-to-ask.md) * [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md) · [AI Credits](https://dzbuild.com/docs/advanced/ai-credits.md) --- Source: https://dzbuild.com/docs/copilot/what-it-can-do.md # What DZBuild Copilot can and cannot do Copilot has **80 store actions** available to it. You never see their names: you write a sentence and Copilot picks the right ones. This page is the honest inventory of what those sentences can achieve, and of the walls that exist on purpose. Everything below happens in **the store named at the top of the chat**, and only for the store owner. ## What it can do | Area | Ask Copilot to… | | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Products** | List and read products · create a product with price, description, SKU, barcode, weight, cost price, compare-at price and category · change any field later · delete a product | | **Photos** | Add a photo from a link **or from a photo you attach in the chat** · set alt text · choose the main photo · reorder · delete a photo (up to 20 per product) | | **Variants** | Set colours, sizes and options with per-option price, stock, SKU, colour swatch and image · set stock per combination | | **Stock** | Read the current stock mode · set an exact quantity, add or subtract, or mark a product unlimited — per product, per option or per combination | | **Categories** | List, create (two levels), rename, reorder, delete | | **Bundles and offers** | Read and set quantity offers — "buy 2 for 5,000 DZD" — with badge text, badge colour and free shipping | | **Buyer input fields** | Read and set the custom fields a buyer fills on a product, such as an engraving text or an uploaded photo, with an extra price | | **Order quantity rules** | Set the minimum and maximum quantity a buyer can order | | **Promo codes** | List codes with their usage · create a discount code · edit one · delete one | | **Landing pages** | List and read your landing pages · create one · add, edit, reorder or delete its sections · publish it · generate a complete page with AI | | **Storefront design** | Read every design field your theme and plan allow · change colours, hero, announcement bar, product cards and checkout wording · switch theme, fast-checkout design or variant style | | **Home page sections** | Add a section of any type, such as one category's products, frequently asked questions, a text, customer reviews or a video · change a section, such as its title, number of products or grid or slider look · move, hide or delete sections. See [Home page sections](https://dzbuild.com/docs/storefront/home-sections.md) | | **Theme home blocks** | On the Digital, Ariana and Prestige themes: read and change the hero slider, category cards, best sellers, promo banners and testimonials | | **Shipping** | Read every wilaya's prices in one go (58 wilayas, or 69 if your store uses the 69-wilaya list) · set home and stop-desk prices, delivery days and which wilayas are open · turn free shipping on or off with a threshold · pull a courier's own tariffs over your prices | | **Couriers** | Show your linked couriers · search the courier catalogue · see exactly which credentials a courier needs · test credentials against the courier's live system · save them · choose the default courier · remove a courier | | **Pixels** | List your pixels · add one · rename it, change its ad account, set it active or default, store a server-side token · delete one | | **Analytics** | Answer questions about revenue, profit, average order value, delivered rate, visitors, conversion, best products, best wilayas, traffic sources and busiest hours | | **Orders** | List, filter and analyse orders by status, date, phone or wilaya · take an order for a customer over chat · move one to another status · cancel one · hand one to your delivery company after you approve it | | **Undo** | Show what it changed, and put a change back the way it was | Beyond your store, Copilot can also **search the web**, **read photos you send it**, and **read documents** — PDF, Word, Excel and OpenDocument files — so a supplier price list or a screenshot of your ad manager is a valid input. Send it a photo, not a link You do not need to host an image anywhere. Attach the photo to your message and ask Copilot to put it on the product — that exact photo lands on the product, converted for the web. ## What it will never do These are not instructions Copilot has been asked to follow. They are walls built into the platform. * **It cannot price an order.** Item prices, delivery cost and any payment fee come from your store's own tables, exactly as your storefront calculates them. A figure someone types into the chat does not override them. The only amount you can add is a discount in DZD on an order Copilot takes for you, and it can never be more than the order total. * **It cannot change your plan, your billing or your payment settings.** * **It cannot add, remove or edit staff accounts or their permissions.** * **It cannot manage your domains or your API keys.** * **It cannot read a courier password or a pixel server-side token back to you** — those are stored write-only. It can replace one, never reveal one. * **It cannot act for a store you do not own.** Staff accounts get a helpful assistant, not store actions. ## How it protects you **It asks before it hurts.** Copilot is required to say what it is about to change — and what could go wrong — before deleting anything, changing prices, creating a promo code, changing shipping rates, switching your theme or touching a courier. **Four actions it cannot do on its word alone.** For the most dangerous changes the platform itself refuses to act until you have been shown exactly what will happen and have said yes. Copilot cannot skip this step or decide for you: 1. **Handing an order to your courier.** The summary names the customer, the phone, the destination, the total and the courier. Once collected, the parcel cannot be recalled from the chat. 2. Creating a **100% discount code**, or changing an existing code to 100%, which makes every order free while you still ship real goods. 3. **Overwriting your wilaya prices** with a courier's own tariffs. 4. **Removing a courier**, which deletes the credentials you stored for it. **Credentials are tested, not trusted.** When you ask Copilot to connect a courier, it tries your credentials against that courier's live system first and refuses to save them if the courier rejects them. **It forgets.** Copilot keeps no memory between conversations. Nothing you said last week leaks into this week's chat. **Shared computer?** If a different merchant signs into the dashboard on the same browser, the chat signs itself out rather than showing your conversations or working on your store. ## Undo — what can be put back Ask in plain words: *"undo that"*, *"رجّع كيما كان"*, *"remets comme avant"*. Copilot can list what it changed and restore it. | Can be undone | Cannot be undone | | ------------------------------------------------------- | ------------------------------------------------------------------------------ | | Storefront design and theme | Products — created, edited or deleted | | Home page sections and theme home blocks | Product photos | | Store settings and profile | Variants | | Categories | Bundles and offers | | Stock | Buyer input fields | | Promo codes | Courier links — the credentials are never kept, so there is nothing to restore | | Pixels (except a server-side token) | A pixel's server-side token | | Shipping prices and settings | Anything Copilot **created** — delete it instead | | Landing page sections: edits, deletions and their order | Publishing a landing page | | | Order quantity rules | | | Orders: status changes, cancellations and courier sends | | | Your choice of default courier | Undo restores a change, not a creation If Copilot created something you did not want, ask it to delete it. Undo reverses edits to things that already existed. Home page sections are the exception: undo also takes away a section Copilot just added. ## Two things that cost extra * **Generating a landing page with AI spends AI credits, not Copilot points** — 20 credits for a medium page, 45 for a tall one. Copilot will tell you before it starts. See [AI Credits](https://dzbuild.com/docs/advanced/ai-credits.md). * **Reading a big document costs points**, because the whole file enters the conversation. Limits per message: 5 files, 15 MB per file, 40 MB in total. ## What's next * [What to ask Copilot](https://dzbuild.com/docs/copilot/what-to-ask.md) — sentences that work, job by job * [Copilot points](https://dzbuild.com/docs/copilot/points.md) — what a message actually costs * [Landing pages](https://dzbuild.com/docs/selling/landing-pages.md) · [Shipping](https://dzbuild.com/docs/selling/shipping.md) · [Pixels](https://dzbuild.com/docs/marketing/pixels.md) --- Source: https://dzbuild.com/docs/copilot/what-to-ask.md # What to ask DZBuild Copilot Copilot is not a search box. Write to it the way you would brief a good employee: say what you want, give the numbers, and let it work. Everything on this page is a sentence you can copy. Write in whichever language you are comfortable in: Arabic, Algerian darija and French all work. The examples below are in English only because this page is. ## How to phrase a request 1. **Say the goal, not the steps.** "Make me a landing page for the black watch" beats "open the landing page editor". 2. **Give the numbers you already know** — price, stock, wilaya, dates. Every number you leave out is a question Copilot has to ask. 3. **One job per message.** A big job in one message is fine; two unrelated jobs are not. 4. **Attach the photo or the file** instead of describing it. 5. **Read the summary before you say yes.** Copilot tells you what it is about to change. That sentence is where you catch a wrong price. ## Setting up a new store > "I sell women's perfume. Set up my store: create the categories you think I need, set the colours to something warm and elegant, and write the announcement bar." > "Look at my store and tell me what is still missing before I can start running ads." Copilot reads the store first, tells you what it plans to do, and then does it. Expect it to ask two or three questions — answer them in one message and it continues. ## Adding a product > "Add this product: name it *Chanel-style perfume 50ml*, price 4,200 DZD, stock 30, put it in the Perfumes category, and use the photo I attached." > "Write a better description for the black hoodie: short, for Algerian buyers, no lies." > "Add sizes S, M, L and XL to the black hoodie, 20 in stock each, and XL costs 300 DZD more." > "Add a buy-2 offer on the perfume: 7,500 DZD for two, badge in red, free delivery." Send a photo of the product Attach a photo from your phone and write *"add this product with this photo"*. Copilot reads the photo, creates the product and attaches that exact image. You can also send a supplier's price list as a PDF or Excel file and ask it to create the products from it. ## Building a landing page > "Build me a landing page for the black watch and publish it." > "Generate a full AI landing page for the black watch, medium size." > "On my perfume landing page, add a countdown ending Friday and move the order form above the testimonials." Generating a full page with AI spends **AI credits** — 20 for a medium page, 45 for a tall one — and Copilot says so before it starts. Building a page section by section costs no credits at all. ## Delivery and couriers > "Set home delivery to 600 DZD and stop desk to 350 DZD for every wilaya, then make Tamanrasset and Illizi 1,200 DZD." > "Turn on free delivery over 8,000 DZD." > "Close the wilayas I cannot deliver to: Tindouf, Illizi, Djanet." > "I want to connect Yalidine. What do you need from me?" Copilot will tell you exactly which credentials that courier needs, test them against the courier's own system, and only save them if the courier accepts. If you ask it to pull a courier's tariffs over your own prices, it will stop and make you confirm first — that overwrites prices you set by hand. ## Marketing and pixels > "Add my Facebook pixel, the ID is 123456789012345, and make it the default." > "Create a promo code RENTREE, 15% off, valid until the end of September, maximum 200 uses." > "Search the web for what competitors in Algeria are charging for this product and tell me if my price is sane." A 100% code makes every order free Copilot will not create a 100% discount code without showing you what it means and waiting for your yes. Read that message — it is the difference between a promotion and giving away stock. ## Understanding your numbers > "How did the store do this month compared to last month?" > "Which wilayas give me the most cancelled orders?" > "What are my five best products by profit, not by revenue?" > "How many orders are still pending confirmation, and which are older than three days?" Copilot reads your orders and analytics to answer. It can also take an order for a customer, move an order to another status, cancel one, or hand one to your delivery company after you approve the summary. See [Orders](https://dzbuild.com/docs/selling/orders.md). ## Changing how the store looks > "Show me which themes I can use on my plan, then switch me to the one that suits a jewellery store." > "Make the buttons the same green as my logo and put *Free delivery over 8,000 DZD* in the announcement bar." > "Put my three best sellers on the homepage and remove the testimonials section." > "Add a section to my home page with the products of the Dresses category, as a slider." > "Put the Perfumes section at the top of my home page." ## Fixing a mistake > "What did you change in the last hour?" > "Undo the shipping prices you just set." > "That description is too long. Rewrite it in three sentences." Settings changes can be put back. Products, photos and variants cannot — for those, ask Copilot to fix or delete the thing instead. The full table is in [What it can do](https://dzbuild.com/docs/copilot/what-it-can-do.md). ## When Copilot pauses If your points run out, the chat stops and shows you a link to buy more. Your conversation and your store are untouched — top up and continue in the same chat. See [Copilot points](https://dzbuild.com/docs/copilot/points.md). ## What's next * [What Copilot can and cannot do](https://dzbuild.com/docs/copilot/what-it-can-do.md) * [Copilot points](https://dzbuild.com/docs/copilot/points.md) * [Products](https://dzbuild.com/docs/selling/products.md) · [Landing pages](https://dzbuild.com/docs/selling/landing-pages.md) · [Couriers overview](https://dzbuild.com/docs/couriers/overview.md) --- Source: https://dzbuild.com/docs/couriers/ecotrack.md # EcoTrack EcoTrack is a shared shipping API that powers a large family of Algerian couriers. There is no "EcoTrack" tile to pick: you pick **your own courier's tile**, and DZBuild talks to it over the EcoTrack API with a single bearer token. 82 couriers have their own tile: DHD, Conexlog, MSM Go, Rex Livraison, RB Livraison, Speed Delivery, Areex, Prest, Rocket Delivery, WorldExpress, BA Consult, Packers, 48Hr Livraison, Mono Hub, Anderson Delivery, GOLIVRI, Coyote Express, Salva Delivery, Distazero, FRET.Direct, TSL Express, Negmar Express, Ultra Express, OM Express, Med Express, Allo Livraison, Assil Delivery, Expedia Chrono, HHD Express, Imir Logistics, Navex Delivery, Swift Express, Univer Delivery, Colireli, FZ Delivery, Delivromail, PDEX, SI Express, Colex, OKS Box, Majorex, Chronorex, Samex, Aranex, Amana Speed, Wassim Express, One Express, AB Delivery, Royaume Delivery, Eco Rapide Express, SBL Express, Wee Wee Delivery, Jaguar Livraison, RJ 360 Express, Lynx Express, RM Express, Rihal Express, Atlas Express, Boogi Technologie, Cirta Express, Colizone, GS Ecommerce, Jo Express, On Time Express, Quick Delivery DZ, RS Express, Ruta Express, Tawsil Star, Vitrans, BFK Express, Alania Express, Champion Logistics, El Guide Delivery, Fast Horse Express, LIH LIH Express, Mazaya Logistics, Ovred, Speed Mail, Win Delivery, Zinya Tec, Sultan Colis Express, Red Ex. If your courier is on this list, pick its tile — there is no need for a custom integration. Two of them do not sit on `*.ecotrack.dz` hosts but are EcoTrack tenants all the same: **DHD** (`platform.dhd-dz.com`) and **Conexlog** (`app.conexlog-dz.com`). Neither is a separate direct integration. ## What you need A single value from your courier's EcoTrack-powered dashboard: * **API token** (sometimes called "Bearer token", "API key" or "clé API"). Some EcoTrack-based dashboards split it across two screens (account → API → generate). If you can't find it, ask your account manager to enable API access. ## Linking an EcoTrack courier in DZBuild 1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** and search your courier's name in the tile grid (e.g. **DHD**, **Conexlog**, **MSM Go**, …). 2. Click **Lier / ربط** on its tile. 3. Paste your **API token** into the single credential field, labelled **Bearer Token**. EcoTrack-based providers use one field only. 4. Click **Tester la connexion** (« اختبار الاتصال »). The dashboard hits the courier live and confirms the token is valid. 5. Click **Lier et enregistrer** (« ربط وحفظ »). Per-wilaya prices are edited on the separate page [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). ### Custom EcoTrack If your courier is **not** in the tile grid but is built on EcoTrack, pick **Ecotrack personnalisé** (« Ecotrack مخصص ») and provide: * The **API URL** of your courier's EcoTrack instance — the base host only, e.g. `https://yourcourier.ecotrack.dz`. DZBuild appends `/api/v1` itself. * A **display name** (field **Nom du transporteur**, « اسم الشركة »), up to 100 characters. Whatever you type is what appears throughout the dashboard for that courier. * The bearer token. The URL must start with `https://` and point at an EcoTrack host: an address ending in `.ecotrack.dz`, or the DHD and Conexlog hosts above. Any other domain is refused with « رابط API غير مسموح », and internal, loopback and reserved addresses are refused for security. Each custom URL keeps its own synced commune, desk and rate knowledge, so switching the URL starts a fresh sync. Prefer a native tile whenever one exists for your courier. ## What gets synced * The list of **wilayas** and **communes** the courier serves. * **Home delivery rates** per wilaya. * **Stop-desk rates** per wilaya. * Which **communes have a stop desk**. EcoTrack publishes no named desk list, so the [Stop Desk picker](https://dzbuild.com/docs/couriers/stop-desk.md) offers one entry per desk commune, shown as the courier name and the commune. ## What happens when an order ships When you send an order to an EcoTrack courier (the **Envoyer à** « إرسال إلى » button on the order, or a bulk send), DZBuild posts the parcel to the courier's EcoTrack endpoint with: * `nom_client`, `telephone` and `adresse`. `telephone_2` stays empty, because a DZBuild order holds a single customer phone. * `code_wilaya` + `commune`. * `montant`: the **order total** (products plus shipping, minus discount), i.e. what the customer pays on delivery. Every courier family has its own field name and its own amount, so read the per-family table in the [couriers overview](https://dzbuild.com/docs/couriers/overview.md) rather than assuming this one applies elsewhere. Yalidine is the family that sends the subtotal instead, because it bills the delivery fee separately. * `produit` (the item summary), `remarque` (your note), `weight`, and `reference` (your DZBuild order number). * `type` — 1 for a delivery, 2 for an exchange. * `stop_desk` — 0 or 1. There is **no** `delivery_type` field and **no** `stopdesk_id`: a desk parcel is expressed by sending the *desk's commune* as `commune` while `stop_desk = 1`. * `fragile = 1`, only when the product is flagged fragile. The courier returns a **tracking number**. ### Fragile flag Marking a product **Fragile** adds `fragile = 1` to EcoTrack parcels. Outside the EcoTrack family, only MDM Express also receives a fragile flag; no other courier gets one (Yalidine's API rejects unknown parameters outright). ### Product description limit The item summary sent to EcoTrack is capped at **255 characters**. A long multi-item order is shortened in steps: the full list, then the same list with variant suffixes in parentheses stripped, then the first few items plus `+N`, and finally the first item's name cut short, followed by `+N` when the order has other items. ## Printing the courier's own bordereau EcoTrack is one of only two families (the other is Elogistia) whose **own PDF bordereau** prints straight from DZBuild. Clicking **Print label** on an EcoTrack order downloads the courier's official label as a PDF — Custom EcoTrack instances included, using the API URL you stored. EcoTrack orders also get an EcoTrack-only **Expédier** (« تأكيد الشحن ») button on the order detail panel, to confirm the shipment with the courier. ## Common errors and fixes | Symptom | Likely cause | Fix | | ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | The connection test fails with "Invalid or expired API credentials" | Wrong or expired token | Regenerate the token in the courier's dashboard and paste it again. | | « يرجى إدخال رابط API » (Custom EcoTrack) | The API URL field is empty | Paste your courier's base host. | | « يرجى إدخال رابط صحيح يبدأ بـ https\:// » (Custom EcoTrack) | The URL isn't `https://` | Re-enter it with the `https://` scheme. | | « يرجى إدخال رابط عام صحيح (لا يُسمح بعناوين داخلية) » (Custom EcoTrack) | The URL points at a private, loopback or reserved address | Use the courier's public hostname. A public domain outside EcoTrack is refused with « رابط API غير مسموح »; a wrong address on an EcoTrack host shows up as a failed connection test coming from the courier's own API. | | Order created but no tracking number | Address rejected by courier | Check the address on the order; usually a missing or unrecognized commune. | | « مكتب الاستلام (Stop Desk) غير متوفر في هذه الولاية لشركة التوصيل المختارة » or « لا يوجد مكتب استلام (Stop Desk) متاح في هذه الولاية لشركة … » | No desk anywhere in that wilaya | Switch the order to home delivery, or click **Actualiser** on the tile if you think the desk data is stale. | ## Stop-desk routing An EcoTrack desk shipment is **never** downgraded to home delivery. If the customer's commune has no desk, DZBuild reroutes the parcel to another desk commune in the same wilaya, keeps the desk flag on, and writes the redirect into the parcel remark (« مكتب الاستلام: X (بلدية الزبون: Y) »). Only when the wilaya has no desk at all does the send fail, with a message telling you to switch to home delivery. ## Tips * Many EcoTrack-based couriers have **regional** strengths (a specific wilaya cluster). Ask your account manager where they're fastest before promising next-day delivery. * If you change couriers but stay inside EcoTrack, you only need to link the new courier's tile with its token — orders, addresses and customer data are unaffected. * Use **Ecotrack personnalisé** for new couriers that haven't shown up in the DZBuild dashboard yet; it works as long as the courier's API sits on an EcoTrack host (an address ending in `.ecotrack.dz`) and exposes the standard EcoTrack endpoints. --- Source: https://dzbuild.com/docs/couriers/maystro.md # Maystro Delivery Maystro Delivery is a national courier with strong presence across Algerian wilayas. The integration is one of the simplest: a single API token is all you need. ## What you need * One value, labelled **Authentication Token** in the credential modal, issued from your Maystro merchant dashboard. Maystro authenticates with `Authorization: Token ` — it is not a Bearer token. If your account doesn't expose API access, contact Maystro to enable it. ## Linking Maystro in DZBuild 1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** and find the **Maystro** tile. 2. Click **Lier / ربط**. 3. Paste your **Authentication Token** in the single credential field. 4. Click **Tester la connexion** (« اختبار الاتصال »). DZBuild calls Maystro live and confirms the token works. 5. Click **Lier et enregistrer** (« ربط وحفظ »). Per-wilaya prices are edited on the separate page [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). ## What gets synced * The list of **wilayas** Maystro serves. * **Communes** per wilaya. * **Home + desk rates** per wilaya — see below. * The **stop-desk list** for the [Stop Desk picker](https://dzbuild.com/docs/couriers/stop-desk.md). ### Rates Maystro rates **are** syncable. **Sync rates from provider** reads Maystro's own delivery pricing for each wilaya and fills in both the home and the desk price. One caveat worth knowing: Maystro prices per **commune**, not per wilaya, so DZBuild approximates each wilaya with its centre commune. A wilaya whose centre commune returns no pricing stays at 0 — set those by hand on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). ### Desks Maystro's desk list is read from each wilaya's centre commune. Only when the centre commune has no desk does DZBuild check the wilaya's other communes. A desk in an outlying commune of a wilaya whose centre commune already has a desk is therefore not listed, and clicking **Actualiser** does not change that. Desk delivery itself stays available in every wilaya where Maystro prices a desk. Only Maystro's own stop desks are listed; partner pickup points are not supported. ## What happens when an order ships DZBuild posts the order to Maystro with the customer's name, phone and address, the destination wilaya, the commune as **Maystro's numeric commune ID**, the product list, your order number as `external_order_id`, and `product_price` — which is the **order total**, not the subtotal. Two things Maystro does *not* receive: * **Weight** is not sent to Maystro at all. * **No desk id.** Desk delivery is expressed only by `delivery_type: 2` (1 = home, 3 = pickup point). Maystro's API takes no desk field, so when the customer picked a desk DZBuild sends that desk's commune with the desk flag, which routes the parcel to a commune that has a desk. The commune ID is resolved from DZBuild's synced commune data and then a live lookup; if it can't be resolved the send fails with « لم يتم العثور على البلدية … ». Maystro returns a **tracking number** (saved on the order) and a label URL. Printing the Maystro label No dashboard button opens Maystro's label URL — clicking **Print label** on a Maystro order prints DZBuild's own HTML bordereau. Print Maystro's official bordereau from the Maystro portal. ## Common errors and fixes | Symptom | Likely cause | Fix | | ---------------------------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | | The connection test fails immediately | Wrong or expired token | Copy a fresh Authentication Token from Maystro and paste it again. | | `لم يتم العثور على البلدية …` | The commune on the order has no Maystro commune ID | Correct the commune on the order, or click **Actualiser** on the tile to re-sync Maystro's commune list. | | Some wilayas still show a 0 rate after syncing | Maystro returned no pricing for that wilaya's centre commune | Set those wilayas manually on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). | ## Tips * The connection test reads Maystro's wilaya list, so it works on an account with no shipments yet. As long as DZBuild shows green, the token is valid. * After syncing rates, review the table on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) — the centre-commune approximation can sit slightly above or below what you actually pay in outlying communes. * Maystro is a good complement to Yalidine if you want a backup courier for specific zones. --- Source: https://dzbuild.com/docs/couriers/noest.md # Noest Express Noest Express is an Algerian courier with its own standalone API — it is not an EcoTrack tenant. DZBuild has a dedicated Noest integration, so linking it takes just two values. ## What you need * **API Token** * **User GUID** Both values come from your Noest merchant dashboard. The GUID identifies your store inside Noest; the token authenticates the API calls. ## Linking Noest in DZBuild 1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** and find the **Noest** tile. 2. Click **Lier / ربط**. 3. Paste your **API Token** in the first field and your **User GUID** in the second. 4. Click **Tester la connexion** (« اختبار الاتصال »). DZBuild verifies the credentials live. 5. Click **Lier et enregistrer** (« ربط وحفظ »). Per-wilaya prices are edited on the separate page [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). ## Auto-validate — read this before your first send The credential modal has a **Noest-only auto-validate switch**, and it is **off by default**. With it off, an order DZBuild pushes to Noest is created as an **editable draft**. Noest's logistics team never sees it until you open the Noest dashboard and validate it yourself. Turn the switch on and DZBuild validates each order right after creating it (marked « تم التأكيد تلقائياً »). If that validation call fails, the order is still created and DZBuild marks it « يحتاج تأكيد يدوي من لوحة NOEST » — validate it yourself in the Noest dashboard. The trade-off: a validated order is no longer editable in Noest. ## What gets synced * The list of **wilayas** Noest serves. * **Communes** per wilaya, matched against Noest's own synced commune list. * **Home + desk rates** per wilaya: **Sync rates from provider** fills the home price and the desk price for every wilaya. You can still override any wilaya by hand on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). * The **desk list**, with each desk's name, address and phone, all shown in the [Stop Desk picker](https://dzbuild.com/docs/couriers/stop-desk.md). Each desk has a code whose number is the wilaya, e.g. `16A` is in wilaya 16. ## What happens when an order ships DZBuild submits the order to Noest with the customer's name, phone number (a DZBuild order holds a single customer phone, and that is the number Noest receives), address, destination wilaya and commune, the product summary, your order reference, and: * `montant` — the **order total** (products plus shipping), not the subtotal. * `poids`: the weight in whole kilograms, rounded down (a parcel under 1 kg is sent as 0), or 1 when no product on the order has a weight. * `can_open`: 1 by default, so the customer may open the parcel before paying. Untick **Le client peut ouvrir le colis avant de payer** (« السماح للزبون بفتح الطرد قبل الدفع ») above the send button to send 0 for that order. The Noest card on `/dashboard/link-shipping` holds the default for that box (same switch on the Zimou Express card): turn it off there and every new send starts unticked; the box above the send button still decides for one order. * `type_id`: always 1, a normal delivery. DZBuild does not create Noest exchanges or pick-ups. * For desk delivery: `stop_desk: 1` plus a **`station_code`** (Noest's desk code, e.g. `16A`) resolved from the synced desk list. `commune_id` is a separate field sent when known — it is not the desk reference. If no station can be found for the wilaya the send is **refused** with « لا توجد نقطة استلام (Stop Desk) متاحة في ولاية … » rather than being downgraded to home delivery. Commune resolution runs against the synced Noest commune list first, then a live API match. If neither matches, **the send is refused** — you get an Arabic error naming the commune plus up to five suggested nearby communes, and no tracking number is created. DZBuild refuses rather than risk delivering to the wrong commune. Noest returns a **tracking number**. A bordereau download URL exists on Noest's API, but no button in the DZBuild dashboard opens it — **Print label** on a Noest order prints DZBuild's own HTML bordereau. Print Noest's official label from the Noest dashboard. Noest throttles aggressively, so bulk sends are paced and retried automatically when the API returns a rate-limit response. ## Common errors and fixes | Symptom | Likely cause | Fix | | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | « بيانات الاعتماد غير صحيحة - تأكد من api\_token و user\_guid » or « user\_guid قصير جداً - انسخه كاملاً من لوحة NOEST » | Wrong token, wrong GUID, or both; or a GUID pasted only in part | Re-copy each value from the Noest dashboard; the two are easy to swap, and the GUID must be pasted in full. | | « البلدية … غير موجودة في قاعدة بيانات NOEST » | Noest doesn't know that commune spelling | Pick one of the suggested communes shown with the error, or click **Actualiser** on the Noest tile to re-sync the commune list, then re-send. | | « مكتب الاستلام (Stop Desk) غير متوفر في هذه الولاية لشركة التوصيل المختارة » or « لا توجد نقطة استلام (Stop Desk) متاحة في ولاية … » | No Noest desk in the customer's wilaya | Refresh provider data, switch courier, or change the order to home delivery. | | The parcel never appears in Noest's logistics view | Auto-validate is off and the draft was never validated | Validate it in the Noest dashboard, or turn on auto-validate in the credential modal. | ## Tips * Decide on **auto-validate** before your first bulk send — a batch of unvalidated drafts is easy to miss. * Commune matching depends on the synced Noest commune list. If you sell into a commune Noest recently added, click **Actualiser** on the tile instead of waiting for the automatic daily refresh. * Noest parcels carry no declared value and no insurance field — those are Yalidine-family only. --- Source: https://dzbuild.com/docs/couriers/overview.md # Couriers overview DZBuild supports the major Algerian couriers. Once you link a courier in your dashboard, DZBuild can push new orders to the courier's API, return tracking numbers to your customer, and pull rates and stop-desk lists straight from the provider. ## 🎬 Video [Couriers — connect your shipping provider in DZBuild](https://www.youtube.com/embed/ASUHRweCuOg) ## Supported couriers | Courier | Slug | Notes | | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | [Yalidine](https://dzbuild.com/docs/couriers/yalidine.md) | `yalidine` | Mature API; wilayas, communes and desks are synced from Yalidine's own API | | [EcoTrack family](https://dzbuild.com/docs/couriers/ecotrack.md) | 82 courier tiles (`dhd`, `conexlog`, `msmgo`, `rocketdelivery`, `andersondelivery`, `speeddelivery`, `worldexpress`, …) plus `customecotrack` | There is no `ecotrack` slug to pick. EcoTrack is a shared Bearer-token API, so you pick **your own courier's tile** | | [ZR Express](https://dzbuild.com/docs/couriers/zr-express.md) | `zrexpressnew` | One merged tile. Paste either credential pair — DZBuild works out whether you are on the new platform or the legacy Procolis API | | [Maystro Delivery](https://dzbuild.com/docs/couriers/maystro.md) | `maystro` | Single-token API | | [Noest Express](https://dzbuild.com/docs/couriers/noest.md) | `noest` | API Token + User GUID | | Abex Express, Leopard Express, Colilog Express, Flash Delivery | `abexexpress`, `leopardexpress`, `colilog`, `flashdelivery` | Same Procolis API shape as legacy ZR Express, each with its own Token + Key | | Zimou Express | `zimou` | Standalone courier API | | Colivraison | `colivraison` | Standalone courier API | | Ecom Delivery | `ecomdelivery` | Standalone courier API | | MDM Express | `mdm` | Single **API Key** field; each order line is matched to your products in your MDM account by SKU or name; no rate sync, set prices by hand | | Near Delivery | `neardelivery` | API Key + API Secret; relay-point (desk) delivery only, home orders are refused; no rate sync, set prices by hand | | Elogistia | `elogistia` | Single **API Key** field; one of only two families whose own PDF bordereau prints from the dashboard | | [Stop Desk](https://dzbuild.com/docs/couriers/stop-desk.md) | delivery type + addon | Customer pickup at courier offices; works with any linked provider | The Yalidine API service also works with **Yalitec**, **Guepex**, **Easy & Speed**, **Economiqua** and **We Can Services**. They share the same API shape and are exposed under their own slugs in the dashboard. DHD and Conexlog are **EcoTrack tenants**, not separate integrations: they just live on their own hosts (`platform.dhd-dz.com` and `app.conexlog-dz.com`) instead of `*.ecotrack.dz`. See the [EcoTrack page](https://dzbuild.com/docs/couriers/ecotrack.md) for the full tile list. ## Where to link a courier Couriers are linked at **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** — in the sidebar, **Paramètres de livraison → « Connecter un transporteur »** (« ربط شركة التوصيل »). The page is a searchable grid of courier tiles. From there you can: * Link a courier: click **Lier / ربط** on its tile, fill the credentials, and save. * Manage an already-linked courier: the tile's button becomes **Gérer / إدارة**. * Set one linked courier as the store's default (**Définir comme transporteur par défaut** / **تعيين كشركة افتراضية**). * Pause a courier (switch off **Activer l'envoi des commandes via API** / « تفعيل إرسال الطلبات عبر API » in its window) or **Délier / إلغاء الربط** it at any time without losing your existing orders. Tile chips show link state, not a live credential check: green chips mean the courier is linked or active, amber chips mean it is the default or paused. A red **API expirée** (« بيانات API منتهية ») pill appears after repeated authentication failures over the last 30 days. A red **API expirée, envois arrêtés** (« بيانات API منتهية، الإرسال متوقف ») pill means the courier kept refusing your keys: sending and automatic tracking stop for that courier until you paste fresh credentials and click **Enregistrer les modifications**. To check credentials right now, open the tile and click **Tester la connexion**. The separate page **[`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping)** (« Tarifs de livraison » / « أسعار الشحن ») is the per-wilaya shipping-**price** table. That is where you find: * A home price and a desk price for every wilaya, each behind its own switch, so you can turn off home delivery, desk delivery, or both for a given wilaya. * The wilaya list itself: **58 wilayas** (the courier-compatible list) or **69 wilayas** (which adds 11 newer ones such as Aflou, Barika and Bou Saâda). The mode selector sits at the top of the page. Courier APIs do not accept those newer wilayas, so the 69 option is greyed out while a courier is linked. Linking a courier does not move a store that is already on 69 back to 58: click 58 yourself. * **Sync rates from provider** — pulls each wilaya's home + desk rates from the linked courier. note Shipping pages do not exist for **digital-product stores** (the digital theme redirects both pages to the dashboard). Team members need the `shipping.view` permission to open them and `shipping.edit` to change anything, and the store's subscription must be active. If your business model needs **per-product** shipping prices (heavy items, size-based fees, free-shipping flags on specific SKUs), enable the **Custom Product Shipping** addon. It requires the **Pro** plan or higher (activating it on Free is refused with « هذه الإضافة تتطلب خطة pro »), is unavailable on the **digital** theme, and has its own page at `/dashboard/addons/custom-shipping`. It gives you a per-product flat rate or per-wilaya pricing, per-product free shipping, highest-price-wins for mixed carts, and a "copy from store rates" shortcut. ## What gets synced from the courier | Data | Yalidine | EcoTrack | ZR Express | Maystro | Noest | | ------------------- | -------- | -------- | -------------------------------------- | ------------------ | ----- | | Wilayas list | ✅ | ✅ | ✅ | ✅ | ✅ | | Communes per wilaya | ✅ | ✅ | ✅ | ✅ | ✅ | | Home + desk rates | ✅ | ✅ | ✅ | ✅ | ✅ | | Stop desk list | ✅ | ✅ | New platform ✅ / legacy: no desk list | ✅ (pickup points) | ✅ | Every linked courier can sync rates except MDM Express and Near Delivery, whose prices you set by hand; a paused courier stays out of the sync list until you turn it back on. Maystro prices per commune, so each wilaya is quoted from its centre commune; Noest returns one home price and one desk price per wilaya. The **legacy ZR Express (Procolis) platform publishes no desk list**: a whole wilaya counts as desk-eligible whenever its Stopdesk price is above zero, the customer sees a generic commune-level "ZR Express agency" option, and ZR picks the actual pickup point on dispatch. The new ZR platform returns a real hub list. ### Refreshing provider data Everything in the table above refreshes automatically overnight, once a day. Your own prices are not part of it: the rates on `/dashboard/shipping` change when you run a rate sync with **Sync rates from provider** there (or the sync switch when you link a courier) or edit them by hand. To force a refresh of one courier's wilayas, communes and desks (the fix for *"my new courier shows no desks or communes yet"*), open the courier's tile at `/dashboard/link-shipping` and click **Actualiser** (« تحديث البيانات ») inside the modal. The button only appears for an already-linked courier, works only while that courier is active (not paused), and has a **5-minute cooldown** per courier. ## What happens when an order is sent to the courier 1. You confirm the order in [`/dashboard/orders`](https://dzbuild.com/dashboard/orders). 2. In the send-to-delivery modal you pick which linked courier ships it, and DZBuild calls that courier's API with the customer's name, phone, address, item list and the COD amount. 3. The courier returns a **tracking number**, saved on the order. 4. The order moves to **`processing`** — but only if it was `pending` or `confirmed`; a later status is left alone. DZBuild also stores the tracking number, the courier name, and the send timestamp. 5. The order becomes `shipped` on its own once the tracking sync sees a pickup or transit status, then `delivered` (or `returned` / `cancelled`). The payload differs per courier family, and this is the part merchants most often get wrong: | What is sent | Yalidine family | EcoTrack family | ZR Express (legacy) | ZR Express (new) | Maystro | Noest | | -------------- | ----------------------------- | ---------------------------------------------- | --------------------- | ---------------------------------------- | ----------------------------- | ------------------------------- | | COD amount | `price` = **subtotal** | `montant` = order total | `Total` = order total | `amount` = order total | `product_price` = order total | `montant` = order total | | Desk reference | `is_stopdesk` + `stopdesk_id` | `stop_desk` 0/1 (commune = the desk's commune) | `TypeLivraison` 0/1 | `deliveryType: "pickup-point"` + `hubId` | `delivery_type: 2` | `stop_desk: 1` + `station_code` | | Weight | ✅ | ✅ | not sent | not sent | **not sent** | `poids` | | Declared value | ✅ | — | — | — | — | — | Yalidine is the only family that receives a declared value and a `stopdesk_id`, and the only one whose COD amount is the subtotal rather than the order total (Yalidine bills the delivery fee separately). ### Printing labels **Print label** fetches the *courier's* own PDF bordereau only for **EcoTrack-family** couriers and **Elogistia** (whose bordereau comes in three sizes — 15×20, 10×15 and 10×10 cm, with 10×15 as the default). For every other courier it prints DZBuild's own HTML bordereau. Yalidine, Maystro and Noest label URLs are captured and stored on the order, but no dashboard button opens them today — print those from the courier's own portal. ## Tracking sync DZBuild checks each linked courier automatically for the orders it has in flight and moves them along on its own: `processing → shipped → delivered`, or `returned` / `cancelled`. A status change on the courier's side usually shows up on your order within a few minutes. A courier cancellation restores stock right away. A courier return restores it once the courier reports the parcel back with you, when you click **Retour reçu** (« استلمت المرتجع ») on the order, or 15 days after the return started, whichever comes first. Two things worth knowing: * A courier status DZBuild does not recognise leaves the order untouched. * A parcel the courier cannot find is **never** cancelled automatically — it is left as-is and re-checked next cycle. Only an explicit `cancelled` status from the courier cancels an order. ## Weight surcharge Parcels heavier than **5 kg** add a surcharge on top of the wilaya rate at checkout: **50 DA per extra kg**, rising to **100 DA per extra kg** for the 13 deep-south wilayas (Adrar, Béchar, Tamanrasset, El Bayadh, Illizi, Tindouf, Naâma, Timimoun, Bordj Badji Mokhtar, Béni Abbès, In Salah, In Guezzam, Djanet) when the courier is Yalidine, Yalitec or Guepex. Easy & Speed is deliberately excluded from the deep-south rate. The surcharge is computed from your products' weights and is added to what the customer pays. It does not appear as a line in the shipping-rates table, so a wilaya priced at 600 DA can quote more than 600 DA for a heavy cart. This is the courier's own pricing rule; DZBuild applies it rather than inventing it. If you do not want it charged on a given product, leave that product's weight empty, or set free shipping on it. ## Linking flow (high level) 1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** and search the tile grid for your courier. 2. Click **Lier / ربط** on its tile. 3. Paste the credentials the courier issued you (token, ID, GUID — depends on the courier; see each per-courier page). 4. Click **Tester la connexion** (« اختبار الاتصال »). 5. Click **Lier et enregistrer** (« ربط وحفظ »). Optionally tick **Définir comme transporteur par défaut**. The first courier you link becomes the default on its own, and **Synchroniser les tarifs avec votre compte transporteur** (« مزامنة الأسعار مع حساب شركة التوصيل ») is already ticked for it, so its per-wilaya rates are pulled in the background right after linking. 6. Go to [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) to sync per-wilaya rates from the provider or set them by hand. ## When your courier is not on the list Work through this in order. 1. **Ask your courier whether they run on EcoTrack.** A large share of Algerian couriers do, and 82 of them already have their own tile in the grid. If yours is an EcoTrack tenant with no tile of its own, the **Ecotrack personnalisé** (« Ecotrack مخصص ») tile takes the courier's name, its API URL (an `https://` address ending in `.ecotrack.dz`) and a bearer token, and behaves identically. See the [EcoTrack page](https://dzbuild.com/docs/couriers/ecotrack.md). 2. **Ship manually in the meantime.** Confirm the order, hand the parcel to the courier, then mark the order `shipped` in [`/dashboard/orders`](https://dzbuild.com/dashboard/orders). You lose automatic tracking; nothing else about the order changes. 3. **Send us the request.** Open a support ticket with the courier's name and a link to their API documentation. The documentation link is the part that matters, because without a public API there is nothing to build against. We cannot promise a date for any specific courier. ## Frequently asked **Q: Can I link more than one courier?** A: Yes. Link as many as you want, and flag one as the store's default. When you send an order (single or in bulk) you choose the courier from a dropdown in the send-to-delivery modal, and DZBuild ships it through that courier's API. Nothing has to be shipped manually. For desk orders, couriers with no desk in the customer's wilaya are greyed out in that dropdown and labelled « لا يوجد مكتب », and when the customer picked a specific desk, the courier that owns it is selected for you. **Q: How do COD payouts work?** A: The courier collects the cash at delivery and pays you directly, on its own schedule, under whatever terms you agreed with it. DZBuild never touches that money and is not part of the settlement. See [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md). **Q: My courier is not on the list. Can I still use DZBuild?** A: Yes. See the section just above for the three steps. **Q: A wilaya my courier serves is missing from my rate table.** A: That list mirrors what your own courier account returns, not a DZBuild list, so it moves when the courier changes your account. Click **Sync rates from provider** on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) to pull your rates again; **Actualiser** on the courier's tile refreshes communes and desks, not your prices. If the wilaya is still missing, open a support ticket with the exact error message and the order number, and enter that one order directly in the courier's own platform while we look at it. --- Source: https://dzbuild.com/docs/couriers/stop-desk.md # Stop Desk delivery Stop Desk lets the customer pick up the parcel at the courier's office instead of getting it delivered home. In DZBuild, **Stop Desk is two things at once**: 1. A built-in **delivery type** (`delivery_type = 'desk'`) driven by your own per-wilaya shipping rates — it works with any linked courier, and even with none. 2. An **addon** (Stop Desk Selector) that adds a structured picker showing each desk's name, address and phone at checkout. You can ship desk parcels without the addon — but the addon makes the experience much smoother for your customer. ## Why offer Stop Desk | Reason | Impact | | ------------------------- | --------------------------------------------------------------- | | Cheaper for the customer | Desk fees are usually lower than home delivery | | Lower courier fee for you | Many couriers charge less for desk pickups | | Fewer no-shows | The customer commits when they walk into the office | | Faster delivery | Goes straight to the desk without failed home-delivery attempts | ## Built-in delivery type The Home / Desk toggle at checkout starts from **your own shipping-rate table**. On [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) each wilaya has a desk-delivery switch and a desk price; turn the switch on and customers in that wilaya get the Desk option. This works with **no courier linked at all**. A linked courier also counts. It decides whether the Stop Desk Selector addon can list *named* desks and whether the send to it succeeds. Its synced coverage can also remove Home or Desk in communes it reports it does not serve, and the **Livraison au bureau selon la commune** setting (« التوصيل للمكتب حسب البلدية ») on the same page, on by default, shows Desk only in communes where the courier has a desk. Switch it off to offer Desk in every commune of the wilaya; the customer then collects the parcel at the courier's desk in that wilaya. With the Stop Desk Selector addon active this setting does not apply, because the customer picks the desk from the wilaya's list. The order then carries `delivery_type = 'desk'` plus a desk reference into the courier API — expressed differently by each courier family, see the [table below](#per-courier-desk-availability). For Yalidine, DZBuild resolves the `stopdesk_id` at **send time** rather than storing it on the order: the desk the customer picked, else any desk in their commune, else any desk in the wilaya (the commune sent is then the desk's own commune, so the two always agree). A desk shipment is never silently downgraded to home — if the whole wilaya has no Yalidine desk the send is refused outright. ## Stop Desk Selector addon The Stop Desk Selector addon (slug: `stop-desk`) gives your customers a clean picker UI on the storefront: * **Stop Desk Selector** * Description: Let customers choose a specific desk/pickup point when selecting desk delivery. Features: * Desk selection on checkout * Shows desk name, address & phone * Fallback to commune when no desks available * Only works with linked providers The addon is free (no plan requirement) but is **incompatible with the digital storefront theme** and cannot be activated there — digital-product stores have no shipping pages at all. ### Localized addon copy The addon's display name and description in Arabic and French: #### العربية * **Name**: اختيار نقطة الاستلام * **Description**: اسمح للعملاء باختيار نقطة استلام محددة عند اختيار التوصيل للمكتب. * **Features**: * اختيار نقطة الاستلام عند الدفع * عرض اسم المكتب والعنوان والهاتف * الرجوع للبلدية عند عدم توفر مكاتب * يعمل فقط مع شركات التوصيل المربوطة #### Français * **Nom**: Sélection du point de retrait * **Description**: Permettez aux clients de choisir un bureau/point de retrait spécifique lors du choix de la livraison au bureau. * **Features**: * Sélection du point de retrait au checkout * Affiche nom, adresse et téléphone du bureau * Retour à la commune si aucun bureau disponible * Fonctionne uniquement avec les transporteurs liés ## How customers experience it 1. The customer fills the address form and picks the wilaya. 2. They toggle **Delivery: Desk**. 3. With the addon enabled and the courier linked, DZBuild lists every desk in that wilaya — name, address and phone for each. 4. The customer picks one. The order stores DZBuild's own desk id and desk name; each courier then receives its own kind of desk reference at send time. 5. If the wilaya has no named desks for that courier, the addon **falls back to the commune** so the customer can still finish checkout. If no linked courier has a named desk or a desk-eligible commune anywhere in that wilaya, the Desk option is hidden there and the customer sees « La livraison au bureau n'est pas disponible dans cette wilaya » (« التوصيل لنقطة الاستلام غير متوفر في هذه الولاية »). Paused couriers are left out. The desk picker isn't limited to the classic checkout — it also appears on **landing pages** and in the product-page **fast checkout**. ### How a wilaya is judged to "have desks" The addon builds its availability map in two levels: 1. **Named desks** — actual desks synced from your linked couriers, with address and phone. 2. **Commune-level fallback** — for a courier/wilaya pair with no specific desks, any commune the courier flags as desk-eligible. If **no** linked provider has any desk data at all, the picker disappears entirely and checkout falls back to plain desk delivery priced from your own rate table. Right after linking a new courier, that's usually just missing sync data — open the courier's tile at [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping) and click **Actualiser**. ## Enabling Stop Desk 1. Link a courier at [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping). 2. Set the desk rate and the desk switch per wilaya on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). Desk rates can be synced from every linked provider except MDM Express and Near Delivery, or set by hand. 3. (Optional) Enable the free **Stop Desk Selector** addon from [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). 4. Test on the storefront — pick a wilaya, toggle Desk, and verify the desk list shows up. ## Per-courier desk availability | Courier | Desk list source | What is sent with the parcel | | ---------------------------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Yalidine family | Synced from API | `is_stopdesk` + a `stopdesk_id` resolved at send time. | | EcoTrack family | Synced from API per courier | `stop_desk = 1`, with the **desk's commune** as the commune. No desk id exists in the API. | | ZR Express — new platform | Synced from API (pickup-point hubs) | `deliveryType: "pickup-point"` + `hubId`. | | ZR Express — legacy Procolis | **No desk list published** | `TypeLivraison = 1`. The picker offers a generic commune-level "ZR Express agency" and ZR chooses the actual desk on dispatch. | | Maystro | Synced from API (pickup points per commune) | `delivery_type: 2`. Maystro's create API has no desk field, so DZBuild sends the picked desk's own commune instead, and the parcel lands in a commune that actually has a pickup point. | | Noest | Synced from API | `stop_desk: 1` + **`station_code`** (e.g. `16A`, where 16 is the wilaya). Refused with « لا توجد نقطة استلام (Stop Desk) متاحة في ولاية … » if no station is found. | ## When a desk send is refused A "no desk in this wilaya" refusal often comes from **DZBuild's own synced knowledge**, before the courier is ever called. Three ways out: * Click **Actualiser** on the courier's tile to refresh its desk data, then re-send. * Switch courier. The send-to-delivery modal greys out couriers with no desk for that customer and appends « لا يوجد مكتب » to their name. * Change the order to home delivery. ## Stop Desk vs Pickup from Store These are easy to confuse: | | Stop Desk | Pickup from Store | | --------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------ | | Where the customer collects | The **courier's** office | **Your own** address | | Cost to the customer | The courier's desk fee | Free | | Sent to a courier? | Yes, it's a normal shipment | No — pickup orders are marked and never sent to a delivery company | | Plan | Free (addon optional) | **Unlimited** | | Managed at | `/dashboard/shipping` + the Stop Desk Selector addon | `/dashboard/pickup-points` | Pickup from Store adds a **third** option to the checkout toggle: home, desk, or pickup from store. It is also unavailable on the digital theme. ## Tips * Always set both `home` and `desk` rates per wilaya. Customers compare the two — pricing the desk a bit lower than home delivery nudges adoption. * If the addon is on but a wilaya has no named desks for your courier, the commune-level fallback keeps checkout from breaking. * For Yalidine, encourage customers to pick a specific desk. DZBuild will fall back to another desk in the commune or the wilaya if they don't, but the parcel then lands wherever that fallback points. * Pair Stop Desk with [COD](https://dzbuild.com/docs/payments/cod.md): customers are usually more comfortable paying cash at a courier office than at home with a stranger. --- Source: https://dzbuild.com/docs/couriers/yalidine.md # Yalidine Yalidine is a widely used national courier in Algeria with a stable API. The wilayas, communes and desks you can ship to come from Yalidine's own API: DZBuild syncs what Yalidine returns and never adds coverage of its own. The same DZBuild integration also powers **Yalitec**, **Guepex**, **Easy & Speed**, **Economiqua** and **We Can Services**, which share Yalidine's API structure under their own dashboards. ## What you need You only need two values from your Yalidine merchant dashboard: * **API ID** * **API Token** Both are issued from your Yalidine account; if you don't see them, ask Yalidine to enable API access for your account. Yalidine API access usually requires a verified business account. ## Linking Yalidine in DZBuild 1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** in your dashboard and search "Yalidine" in the tile grid (or Yalitec / Guepex / Easy & Speed / Economiqua / We Can Services if that's your reseller). 2. Click **Lier / ربط** on the tile. 3. Paste your **API ID** in the first field. 4. Paste your **API Token** in the second field. 5. Click **Tester la connexion** (« اختبار الاتصال »). The dashboard hits Yalidine live and shows a green check if the credentials are valid. 6. Click **Lier et enregistrer** (« ربط وحفظ »). Tick **Définir comme transporteur par défaut** if Yalidine should be the store's default. Rates live on the separate page **[`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping)**. From there you can: * **Sync rates from provider** — pulls Yalidine's home + desk fees per wilaya. * Override any wilaya's rate manually if you want to absorb part of the shipping or charge a markup. Set your store's wilaya first Rate syncing for the Yalidine family (Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua, We Can Services) needs your store's own wilaya. If it isn't set in your store settings, the sync fails with « يرجى تحديد ولاية المتجر أولاً من إعدادات المتجر قبل مزامنة الأسعار. ». The same wilaya is sent as `from_wilaya_name` on every parcel, and defaults to Alger when unset. ## Express vs Économique (Guepex only) The credential modal shows a delivery-tier selector, **Express** or **Économique**, for **Guepex only**. Yalidine, Yalitec, Easy & Speed, Economiqua and We Can Services always ship Express: DZBuild never sends them the `economic` parameter, which Yalidine's API rejects outright. The tier you pick is used for the parcel you send and for the rates DZBuild pulls when you click **Sync rates from provider**, so after switching it, sync rates again to update what your customer is charged. Économique applies only where your Guepex account offers it; elsewhere the Express rate is used. ## What gets synced * Full list of **wilayas** and **communes**. Commune names are taken primarily from the synced provider commune list (Yalidine's own spelling), with DZBuild's own built-in commune list as a fallback. A commune that doesn't belong to the wilaya on the order makes the send fail (« البلدية المحددة لا تنتمي إلى الولاية المختارة ») rather than being auto-corrected. * Per-wilaya **home delivery rate**. * Per-wilaya **stop-desk rate**. * The list of **stop-desks** in each wilaya, used by the [stop-desk picker](https://dzbuild.com/docs/couriers/stop-desk.md). ## Product dimensions The product form shows **length / width / height** fields only when a Yalidine-family courier is linked — no other family accepts dimensions. If you leave them empty, the parcel goes out as 10 × 10 × 10 cm and 0.5 kg. ## What happens when an order ships When you send an order to delivery from [`/dashboard/orders`](https://dzbuild.com/dashboard/orders) and pick Yalidine in the send-to-delivery modal, DZBuild creates the parcel in Yalidine with: * Customer first name, family name, phone (auto-formatted to the local `0X` shape). Only **one** phone number reaches Yalidine, because a DZBuild order carries a single customer phone. * Address, destination wilaya, destination commune (resolved to the French name). * Origin wilaya (your store's wilaya — used as `from_wilaya_name`). * Product list summary. * COD amount (`price` = subtotal, the customer pays this on delivery). * Declared value, length, width, height, weight. * `is_stopdesk` flag, plus a valid `stopdesk_id` when desk delivery is selected. * `freeshipping`, `do_insurance`, and exchange flags when applicable. Yalidine returns: * A **tracking number** (saved on the order). * A **label URL** (PDF), captured and stored on the order. Printing the Yalidine label No button in the DZBuild dashboard opens Yalidine's label URL. Clicking **Print label** on a Yalidine order prints DZBuild's own HTML bordereau — print Yalidine's official label from the Yalidine portal. The order moves to **`processing`** on send (and only if it was `pending` or `confirmed`), and the customer sees the tracking on their order page. It becomes `shipped` when the automatic tracking sync sees a Yalidine transit status such as « Ramassé », « Expédié » or « En cours de livraison », then `delivered` (or `returned` / `cancelled`). ### Product list truncation Long multi-item orders get their product list shortened to fit Yalidine's **150-character** limit. DZBuild degrades in steps: the full `a | b | c` list, then the same list with variant suffixes in parentheses stripped, then the first few items plus `+N`, and finally the first product name cut short plus `+N`. The **Custom Delivery Label** addon (Pro) lets you control what is written there. ## Stop desk with Yalidine The desks you can offer are the Yalidine desks DZBuild has synced from Yalidine's API, refreshed overnight or right away with **Actualiser** on the Yalidine tile. When the customer chooses desk delivery at checkout: * The [Stop Desk addon](https://dzbuild.com/docs/couriers/stop-desk.md) shows desks for the selected wilaya with name, address and phone. * The order stores DZBuild's own `desk_id` / `desk_name`. Yalidine's `stopdesk_id` is resolved at send time: the desk the customer picked, else any desk in their commune, else any desk in the wilaya. The commune sent with the parcel is then forced to the desk's own commune, so the id and the commune always agree. * The send is **refused — never downgraded to home delivery** — only when the whole wilaya has no Yalidine desk. DZBuild can refuse it even before contacting Yalidine, using the desk data it has already synced. ## Common errors and fixes | Message | Cause | Fix | | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | | `Invalid credentials` (on **Tester la connexion**) / `بيانات الاعتماد غير صحيحة` (on send) | Yalidine rejected the API ID or API Token | Re-copy both values from Yalidine's dashboard. The two fields are easy to swap. Confirm the account still has API access. | | `بيانات API لشركة التوصيل غير صالحة أو منتهية الصلاحية، الإرسال متوقف` | Yalidine kept refusing the saved keys, so sending and automatic tracking stop for it | Paste fresh keys on the Yalidine tile and click **Enregistrer les modifications**. | | `حسابك لدى شركة التوصيل معطّل ولا يمكنه إنشاء طرود جديدة` | Yalidine disabled your account | Contact Yalidine to reactivate it, then re-send. | | `تتجاوز الحد الأقصى المسموح به لدى شركة التوصيل (150000 دج)` | The order subtotal is above Yalidine's 150,000 DA cap | Split the order into two parcels, or send it with another courier. | | `Create Order failed:` followed by Yalidine's own words | Yalidine refused the parcel | Fix what the message names, then re-send. | | `لا يوجد مكتب استلام (Stop Desk) متاح` | The whole wilaya has no Yalidine desk | Refresh provider data from the tile, or switch the order to home delivery. | | `البلدية المحددة لا تنتمي إلى الولاية المختارة` | Commune / wilaya mismatch on the order | Fix the commune on the order, then re-send. | | Order created but no tracking returned | Address or commune not recognized | Check the commune spelling on the order, then re-send. | ## Tips * Yalidine expects communes in **French**. DZBuild matches against Yalidine's own synced commune list first and falls back to its built-in commune list, but uncommon spellings can still fail — keep your store's commune list clean, and click **Actualiser** on the Yalidine tile if the synced list looks stale. * The `price` sent to Yalidine is the **subtotal** (product price), not the order total with shipping. This is what the courier collects on COD. * If you also have a Yalitec, Guepex, Easy & Speed, Economiqua or We Can Services account, link it under its own slug. The API shape is the same but credentials are not interchangeable. --- Source: https://dzbuild.com/docs/couriers/zr-express.md # ZR Express ZR Express runs two APIs, the legacy **Procolis** API at `procolis.com` and the newer platform at `api.zrexpress.app`, but in DZBuild there is **one "ZR Express" tile**. Which wilayas, communes and desks you can ship to comes from your own ZR account: DZBuild syncs exactly what it returns, and never adds coverage of its own. You do not choose an API. Paste whichever credential pair you have and DZBuild works it out: it tries the new platform first, then falls back to the legacy Procolis pair, and stores the link under whichever platform accepted the credentials (a legacy match reports « تم الاتصال بنجاح مع ZR Express (المنصة القديمة) »). Stores that were linked before the two tiles were merged keep their existing legacy ZR Express link and manage it from the same tile. ## What you need Two values, whichever platform you are on. On the tile the fields are labelled **API Key** and **Tenant ID**: | Your platform | API Key field | Tenant ID field | | --------------- | ------------- | -------------------------------------------------------------- | | New platform | Secret Key | Tenant ID (a UUID like `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) | | Legacy Procolis | Token | Key | Both come from your ZR Express account — the new portal exposes them in the API/integrations area, the legacy dashboard under its API settings. **Abex Express** runs on the same Procolis API shape and the same host, and still shows the Token / Key labels — but it has its own tile, its own credentials issued by Abex, and its own synced commune data. The two are not interchangeable. ## Linking ZR Express in DZBuild 1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** and search "ZR Express". 2. Click **Lier / ربط** on the tile. 3. Paste your two values into **API Key** and **Tenant ID** (on the new platform the Secret Key, then the Tenant ID; on legacy Procolis the Token, then the Key). 4. Click **Tester la connexion** (« اختبار الاتصال »). That one click tries both platforms in turn — new first, then legacy Procolis — and tells you which one accepted your credentials. 5. Click **Lier et enregistrer** (« ربط وحفظ »). ## What gets synced * The list of **wilayas** and **communes** the courier serves. * **Home delivery rates** per wilaya. * **Stop-desk rates** per wilaya. * The **stop-desk list** — **new platform only**. It comes from ZR's hub search, keeping the hubs flagged as pickup points, and feeds the [Stop Desk picker](https://dzbuild.com/docs/couriers/stop-desk.md). The **legacy Procolis platform publishes no desk list at all**. Every commune in a wilaya counts as desk-eligible whenever that wilaya's Stopdesk price is above zero; the customer then picks a generic commune-level option, shown as ZR Express followed by the commune name, and ZR chooses the actual pickup desk when the parcel is dispatched. New platform: territory UUIDs The new platform addresses places by territory UUID, not by name. When the synced territory data has no match, DZBuild searches ZR live; if that also fails the send stops with « لم يتم العثور على: … في … » (commune) or « لم يتم العثور على الولاية في نظام شركة التوصيل » (wilaya). Check the commune spelling on the order, click **Actualiser** on the ZR Express tile (or wait for the automatic daily refresh) and re-send. ## What happens when an order ships DZBuild sends the customer's details, wilaya and commune, the product description, your order number as the external reference, and the COD amount — which on **both** platforms is the **order total** (products plus shipping), not the subtotal. Desk delivery is expressed differently per platform, and neither uses `is_stopdesk` or `stopdesk_id`: * **Legacy Procolis**: `TypeLivraison = 1` (0 = home). No weight is sent. * **New platform**: `deliveryType: "pickup-point"` plus a `hubId`. If no hub is supplied DZBuild auto-selects the closest one; if that fails the send is **refused** rather than downgraded to home delivery. ZR Express returns a **tracking number** that DZBuild stores on the order and exposes to the customer. The product description is capped at **100 characters** on the new platform (250 on legacy Procolis), and any `|` in a product name is replaced with a hyphen. ## Common errors and fixes | Message | Cause | Fix | | ----------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `API Key و Tenant ID مطلوبان` | One of the two fields is empty | Both are required — make sure the UUID is pasted in full. | | The connection test fails with ZR's own message | Neither platform accepted the pair | DZBuild surfaces the **new platform's** error when both attempts fail, so the message you see may not mention Procolis even if you are a legacy account. Re-copy both values; if it persists, ask ZR Express to activate API access. | | `لم يتم العثور على: … في …` | New platform can't resolve the wilaya/commune territory IDs | Check the commune on the order, click **Actualiser** on the tile, then re-send the order. | Legacy Procolis messages such as *Clé non détectée S1 / S2* and *Token désactivé* can still show up on the order's delivery status for accounts on the old platform — they mean, respectively, a wrong Token, a wrong Key, and a disabled account. ## Tips * A store linked on legacy Procolis opens that link from the tile, with **Token** and **Key** fields, and its connection test tries legacy Procolis only. To move to the new platform, click **Délier** (« إلغاء الربط ») in that window, then link the new pair and switch on **Définir comme transporteur par défaut** (« تعيين كشركة افتراضية ») if ZR was your default courier. DZBuild keeps one ZR Express provider per store. * Provider management (link, manage, test, unlink, set default) lives at [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping); per-wilaya prices live at [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). * If your customers depend on picking a *named* desk, you need the new platform — the legacy API can only offer the generic commune-level agency option. --- Source: https://dzbuild.com/docs/customizing/branding.md # Branding Your branding is the part of the storefront that says "this is me, not a generic shop." DZBuild lets you set every visual element from one page: sidebar **Personnaliser la boutique / تخصيص المتجر** → **Personnaliser / تخصيص** ([`/dashboard/customize`](https://dzbuild.com/dashboard/customize)). ## Logo Upload from **Customize → Header & Logo** (`En-tête et Logo` / `الرأسية والشعار`). | Spec | What the platform accepts | | ------------- | -------------------------------------------------------------------------------------------------------------------------- | | Format | PNG (transparent background recommended), JPG, WebP, GIF, BMP, AVIF or TIFF | | Not supported | **SVG** — the upload fails with "invalid image file" even though the file picker and the on-screen hint appear to offer it | | Dimensions | Any aspect ratio; minimum 50 × 50 px, maximum 4000 × 4000 px (a \~3:1 wide logo still looks best in the header) | | Max file size | 20 MB | The logo shows up in: * The storefront header on **every** page — home, product, cart, category, all-products, checkout and order tracking * The storefront footer and the mobile drawer * Landing pages * Your dashboard sidebar and user avatar * The browser-tab icon, when no favicon is uploaded (see below) * The Open Graph / WhatsApp share image There is **no order-receipt PDF** on DZBuild, courier labels are PDFs generated by the courier's own API, the label you print from the orders page carries only your store name, and transactional emails carry the DZBuild logo — so the logo does not appear on any of those. If you upload a transparent PNG, the logo blends with both light and dark headers. Avoid baking your background colour into the logo file. ## Favicon The little icon in the browser tab. **Customize → Header & Logo → Favicon**. Upload a square PNG or ICO whose size is **exactly** one of 16, 32, 48, 64, 96, 128, 192 or 512 px. Any other size (100 × 100, 256 × 256, 180 × 180 …) is rejected with an error — nothing is resized for you. Max file size 1 MB. Only PNG and ICO are accepted (no JPG, WebP or SVG). Pro feature Custom favicon is available on **Pro**, **Unlimited** and **Enterprise**. Free stores cannot upload one; without a favicon the tab shows your logo, or the default icon when there is no logo. Upgrade from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe); the **▶ How to renew** button on that page launches a guided in-app tour, and video walkthroughs are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). **The tab icon falls back in three steps:** your uploaded favicon → your store logo → the default DZBuild icon. So even on the Free plan, uploading a logo already gives you a branded browser-tab icon. ## Social-card image (Open Graph) DZBuild has **no separate social-card uploader**. On the homepage and most storefront pages, the Open Graph / WhatsApp share image is your **store logo** (the hero image is used as the fallback on theme home pages when no logo is set). On a **product page** the share image is that product's own photo. A **category page** uses the category image when it has one, and a **landing page** uses its first image section, then its product photo, then your logo. Theme home pages (except Brico), product pages and landing pages declare their share image at 1200 × 630, so pick a logo that still reads well when a preview crops it to that box. ## Announcement bar A thin promo strip above the header — useful for a free-shipping message or a campaign deadline. **Customize → Announcement bar**, where you set the text, an optional link, and the background + text colours. Pro feature The announcement bar and all of its colour fields require **Pro** or above. ## Storefront banners The promotional banner block on the homepage. How many slots you get depends on the theme: * **Starter, Brico and Promobi** — none. * **Showcase (Started V2), Prestige and Bloom** — one. * **Digital** — two promo banners plus a 3-slide hero slider. Minimum banner size is 300 × 150 px (a wide 1920 × 600 JPG still works best). Bigger uploads are automatically down-scaled to 2000 px and converted to WebP, so file size is not a hard constraint. A banner button links via a dropdown to the products section, the all-products page, the cart, a category or a product; a **custom URL** field lets you point at anything else, including a landing page. One exception: the Digital theme's banner and hero-slide link selectors offer only the products section, a category or a product — no custom URL — so a Digital banner cannot link to a landing page. ## Colors Under **Colours & font** you get four pickers (Brico hides the **Section titles** picker, so it shows three): * **Primary** — dominant accent (buttons, links, hover states). * **Secondary** — supporting accent (badges, highlights). * **Background** (Pro+) — main page background. * **Section titles** (Pro+) — the heading colour above each homepage block. There is **no body-text colour picker**. Further colour controls live in other sections: navbar background + navbar text (Header & Logo, Pro+), footer background (Footer, Pro+), announcement-bar background + text (Announcement bar, Pro+), the Buy-Now / Fast-Checkout button and fast-checkout background colours (Product page, Pro+), and the checkout banner and page-title background colours (Checkout page, Pro+). On the Free plan only Primary and Secondary are editable; everything else is locked. The live preview shows your **storefront** only — the dashboard's own appearance never changes, and the preview always renders the `*.dzbuild.app` subdomain even if you have a custom domain. Neither Prestige nor Showcase exposes extra accent colours or a hero-overlay-opacity slider; their theme-specific sections are hero copy, categories, featured products, a promo banner, branding/social links, testimonials (Prestige) and three trust badges (Showcase). ## Typography Four fonts are available: | Font | Notes | | ----------- | ---------------------------------------------------------------------------------------------- | | **Cairo** | Default. Arabic + Latin | | **Tajawal** | Arabic + Latin | | **Almarai** | Arabic + Latin | | **Inter** | Latin letters only; Arabic text shows in the visitor's default font, so it suits French stores | Roboto is not offered. There is a **single font setting** that applies to body text and headings alike; no theme exposes a separate heading font. Enterprise stores can load any Google Font via Custom CSS `@import`; see the [Custom CSS guide](https://dzbuild.com/docs/storefront/custom-css-guide.md). ## Store name and meta description The store name appears in the browser tab, the share preview, search-engine results, and the storefront header. Keep it short — 2–4 words is best. The header shows the store name **by default even when a logo is set**. Turn it off with the **Show store name next to the logo** switch, which only appears in Header & Logo once a logo is uploaded; Promobi does not offer the switch. One exception: on phones (screens up to 768 px), when a logo is present and the store name is longer than 12 characters, the theme deliberately hides the text and shows the logo alone. The **meta description** (Customize → SEO) is what shows up in Google search snippets. There is no limit when you save, but the storefront cuts a description longer than 300 characters to its first 297 and adds "..."; Google displays about 150 to 160 characters. If you leave it empty, the storefront uses your store description (when it is at least 40 characters long) or writes one from your store name and your category or product names. Include your category and the value proposition. ## Removing the "Powered by DZBuild" credit Unlimited and Enterprise stores can hide the DZBuild credit in the storefront footer: **Customize → Footer → Hide branding**. On lower plans the switch is locked. ## Your theme must match your plan Each theme carries a plan requirement — Starter, Digital and Brico are Free; Showcase (Started V2) is Pro; Prestige and Bloom are Unlimited; Promobi is Enterprise. A lapsed plan changes your theme's default colours Your theme keeps rendering even if the plan lapses — the layout is not reverted. What does change is the theme's default colour set: the colour layer falls back to Starter's defaults for any colour you never set yourself, and the theme card is locked in the picker until you upgrade. ## Resetting the customization **Customize → ↺ Reset** (`/dashboard/customize/reset`) is **not** an undo button. Reset permanently deletes your brand assets It deletes your uploaded **logo, favicon and desktop hero image** from storage; they cannot be recovered and must be re-uploaded. It also switches the announcement bar off and clears Enterprise Custom CSS and Custom JavaScript, the announcement text and link, the hero headline/sub-headline/button, the categories/featured/products section titles, and the footer About + copyright text, replacing them with fixed Arabic defaults. It then restores a single fixed Starter-style palette (primary `#f59e0b`, secondary `#fbbf24`, white background, `#1f2937` footer, font Cairo) **regardless of which theme is active** — it does not restore your theme's own colours. Your products, orders and customers are untouched. Your social-link URLs (WhatsApp, Facebook, Instagram, TikTok, Telegram, GitHub) also survive. ## Brand consistency tips * Use the **same logo file** across the storefront, packaging and social profiles. Consistency builds trust. * Pick **two colors max** as primary accents — too many looks amateur. * Use **real product photos**, not stock — Algerian buyers can spot stock photography instantly and it kills conversion. * Because your logo doubles as the share image, test it by sharing your store URL in a private WhatsApp chat and check the preview crop. --- Source: https://dzbuild.com/docs/customizing/custom-domain.md # Custom domain By default your storefront is reachable at `{your-slug}.dzbuild.app` (or `{your-slug}.minacef.app` for Minacef-tenant stores). When you're ready to go pro, point your own domain — `myshop.com`, `mybrand.dz`, anything you own — at DZBuild and we'll serve the storefront from there with automatic HTTPS. There is **only one DNS target you need to remember**: > **`link.dzbuild.app`** That's the canonical CNAME target for every custom domain on DZBuild. If you ever read instructions pointing somewhere else, they're out of date. ## What you need * A domain you already own (any registrar — OVH, Namecheap, GoDaddy, Hostinger, GoDaddy.dz, …). * **A paid plan (Pro, Unlimited or Enterprise).** Linking a custom domain is not available on Free — the Domains page shows an upgrade prompt instead of the connect form. Buying a domain through DZBuild is *not* plan-gated; only linking one is. The 3-day Pro trial counts as a paid plan, but see the warning below about what happens when a plan expires. * 5 minutes of attention. Propagation itself usually takes minutes, though it can take up to 24 hours. You do **not** need: * An IP address. We don't publish one — you only point a CNAME and we take care of the routing. * A separate SSL certificate. We provision and renew it for you, automatically. ## Two paths to a custom domain You'll see one of these two flows in **Dashboard → Domains**, depending on what your registrar supports: | Path | When to use | What happens | | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Standard CNAME** | The dashboard knows your provider accepts a root CNAME (Namecheap, for example) and the root (`@`) does not point anywhere yet, or the domain sits on your own Cloudflare account. | You add **one** CNAME record at your current registrar: host `@`, target `link.dzbuild.app` (on your own Cloudflare account, set it to DNS only, the grey cloud). Done in minutes. If the SSL certificate is slow to activate, the dashboard asks for an extra **TXT** record; it shows it only when it is needed. | | **Cloudflare nameservers** (full takeover) | Your provider refuses or rewrites a root CNAME (Hostinger, GoDaddy, OVH, Octenium, Wix, Squarespace, WordPress.com), the root (`@`) already points somewhere, or the dashboard does not recognise your provider. | DZBuild creates a Cloudflare zone for you and copies the existing records it finds, such as MX. You point your domain's nameservers at the two values the dashboard shows. We manage DNS from then on. | The dashboard checks your domain as soon as you type it and leave the field, then tells you which path to take. Hostinger, GoDaddy, OVH, Octenium, Wix, Squarespace and WordPress.com get the **Cloudflare nameservers** path, and so does any domain whose root already points somewhere or whose provider the dashboard does not recognise. On that path the **Verify & link** button turns into **Show the two values**. If the dashboard keeps you on the CNAME path but your registrar's panel still refuses a record on `@`, open the *"Can't add a record on the root domain (@)?"* help card on the Domains page. It suggests a `www` CNAME first, and its link opens a **Switch to Cloudflare DNS** button that starts the nameserver path. ## Path A — Standard CNAME (most providers) ### 1. Add the domain in DZBuild Go to **Dashboard → Domains** ([`/dashboard/domains`](https://dzbuild.com/dashboard/domains)), open the **Connect domain** tab. The card is headed **Verify and link the domain**; type your domain into the input and leave the field. The page checks your domain and shows which path to take; if the button changes to **Show the two values**, skip to **Path B** below. The input accepts either `myshop.com` or `www.myshop.com`; DZBuild strips the `www.` and stores the apex form. ### 2. Add the record at your registrar Sign in to your domain registrar, open the DNS settings (often called *DNS Records*, *Zone Editor*, or *Manage DNS*) and add: | Type | Host / Name | Value / Target | | ------- | ----------------- | ------------------ | | `CNAME` | `@` (apex / root) | `link.dzbuild.app` | That's it — no `A` record, no IP address, no port. Verification also accepts the same CNAME on the **`www`** host, and the storefront is served on both, as long as the button still reads **Verify & link**. A registrar that refuses a CNAME on the root is sent to **Path B** instead. Having both `@` and `www` is fine too; it is not a conflict. If your registrar uses different terminology: * **Host** / **Name** = the subdomain side. `@` means "the domain itself" (the apex). Some panels want the bare domain there instead. * **Value** / **Target** / **Points to** = always `link.dzbuild.app`. * Leave **TTL** at the default (300–3600s). Lower is fine; very high TTLs slow down propagation if you ever need to change something. ### 3. Click Verify & link Back in **Dashboard → Domains**, click **Verify & link**. DZBuild checks the records. When they resolve, your domain appears under **Your store's addresses** and moves through three steps: **DNS settings**, **Security certificate (SSL)** and **Last check**. Your storefront stays on your free address until the last check passes, usually 10 minutes to 2 hours. The domain then shows **Working**. By default it becomes your main address and visitors of the free address are sent to it; you can change both under **Your store's main address**. ### 4. SSL — nothing to do DZBuild issues an SSL certificate for your domain automatically and renews it. Customers see the green padlock. No CSR, no upload, no renewal calendar. If the certificate is still not active 15 minutes after the domain is linked, the dashboard will surface an **extra TXT record** to add. The card in **Domains** shows the exact `Host` and `Value` to copy. Add it at your registrar, in the same place as the CNAMEs, and SSL activation completes within a few minutes. ## Path B — Cloudflare nameservers (when apex CNAME isn't allowed) Some registrars don't accept a `CNAME` on the apex. You'll typically see one of these symptoms: * The registrar's panel rejects `CNAME @` outright. * The `CNAME @` saves but the registrar silently *flattens* it and your domain ends up pointing at the wrong target. * The Verify card shows a flatten warning. In these cases the dashboard switches to the **Cloudflare DNS** wizard. The flow is: 1. **Step 1: Create the Cloudflare zone.** Click **Show the two values** under the domain field (from the help card the button is **Switch to Cloudflare DNS**). We create a zone for your domain on Cloudflare, copy the existing records we find, such as MX, and pre-load the right ones. 2. **Step 2 — Change your nameservers.** The dashboard shows you two `Nameserver` values of the form `something.ns.cloudflare.com` (for example `abby.ns.cloudflare.com` and `rick.ns.cloudflare.com`). The exact pair is unique to your zone, so copy them from the dashboard with the **Copy** buttons rather than typing an example. Sign in to your registrar, find the *Nameservers* section (Hostinger: **hPanel → Domains → DNS/Nameservers → Change nameservers**), and replace the existing nameservers with the two Cloudflare ones. 3. **Step 3 — Wait for activation.** You will **not** receive a Cloudflare email — the zone lives on DZBuild's Cloudflare account, not yours. While the setup is still incomplete the dashboard re-checks nameserver propagation on its own, and you can force a check with the **Check status** button; the step flips to *Activated — DNS is running through Cloudflare* when it lands. Propagation usually takes minutes but can take up to 24 hours. DNSSEC must be off If your registrar has **DNSSEC** enabled on the domain, **disable it before changing nameservers** — otherwise the switch fails and resolvers will refuse the new nameservers. The dashboard reminds you of this on Step 2. After activation, Cloudflare manages your domain's DNS. Your storefront is live on `myshop.com` and `www.myshop.com`, and SSL is automatic. When we create the zone we copy the existing records we find on your domain, such as MX for email and other subdomains, so email keeps working. The zone sits on DZBuild's Cloudflare account, so there is no Cloudflare dashboard for you to log into. ## Verifying it's working Two quick checks: 1. Open `https://myshop.com` in a private window. Your storefront should load (and the URL should stay on `myshop.com`, not redirect away). 2. From a terminal: ``` dig +short myshop.com ``` It should resolve. The exact target doesn't matter — Cloudflare's edge handles routing — what matters is that *something* resolves and the storefront opens. DZBuild also self-heals — connected custom domains are re-checked automatically and the SSL state is repaired if anything drifts. ## Common pitfalls | Symptom | Cause | Fix | | --------------------------------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------- | | "CNAME @ is not allowed" at the registrar | Provider doesn't support apex CNAME | Use **Path B** (Cloudflare nameservers) | | Domain verifies but SSL stays Pending | Certificate activation is taking longer than usual | Add the **TXT record** the dashboard shows under *Extra step required - SSL activation* | | Nameserver switch doesn't take effect | DNSSEC is enabled | Disable DNSSEC, then re-add the nameservers | | Verify still failing after 1 hour | TTL too high on old records | Lower TTL to 300, wait one TTL cycle, re-verify | | Storefront opens on the right domain but customers say "not secure" | SSL still issuing (5–10 min after first verification) | Wait, hard-refresh, retry | | Domain was working, now the storefront is back on the dzbuild.app subdomain | The plan expired and the domain was auto-unlinked | Renew, then re-link and re-verify the domain | ## What happens when your plan expires The link is removed automatically Linking a domain during the 3-day Pro trial works — but roughly **12 hours** after the trial (or any paid plan) expires, DZBuild removes the link and your storefront reverts to `{your-slug}.dzbuild.app`. You keep the domain at your registrar. After renewing, re-link and re-verify it at [`/dashboard/domains`](https://dzbuild.com/dashboard/domains). ## Removing a domain **Dashboard → Domains** → click **Remove**, then **Yes, remove the domain**. We stop accepting traffic on that hostname. Your storefront falls back to `{your-slug}.dzbuild.app`. We don't delete the records at your registrar; that's yours to clean up. If you connected through **Path B**, removing the domain also deletes the DNS zone we created, so point your nameservers back to your registrar's own straight away, or the domain and its email stop working. ## Frequently asked **Q: Can I use a `.dz` domain?** A: Yes. When the dashboard does not recognise your registrar, or the domain's root already points somewhere, it puts you on **Path B** by itself: type the domain, click **Show the two values** and copy both into your registrar's nameserver settings. **Q: Do you publish an IP I can put in an `A` record?** A: No. DZBuild doesn't expose origin IPs. Always use the `CNAME` to `link.dzbuild.app` (or the Cloudflare nameservers flow). Anything telling you to set `A @ {some-ip}` is wrong. **Q: How long does propagation take?** A: Usually minutes, for a CNAME as well as for a nameserver change, but it can take up to 24 hours. Give it a full day before you conclude that something is wrong, and check DNSSEC first if you switched nameservers. **Q: Will `www.myshop.com` work?** A: Yes. On **Path A** you can point `www` at `link.dzbuild.app` as well as, or instead of, the apex; verification accepts either, and the storefront is served on both. On **Path B** we add the `www` record for you. DZBuild always stores the apex form, so `www.myshop.com` resolves to the same store, and the Verify field itself accepts `myshop.com` or `www.myshop.com`. **Q: Multiple stores, one domain?** A: One custom domain per store. If you run multiple stores, each one needs its own subdomain or apex. **Q: Does this affect SEO?** A: Positively — search engines treat `myshop.com` as a real brand. Canonical URLs are set automatically. After the domain goes live, submit a sitemap to Google Search Console for the new hostname. --- Source: https://dzbuild.com/docs/customizing/themes.md # Themes DZBuild ships **7 selectable themes**. A theme sets the whole look of your homepage — header, hero, product grid, sections and footer. Pick the one that fits the kind of catalog you sell, then customize colors, banners and copy from the dashboard. ## 🎬 Video — customization walkthrough [Customizing your storefront](https://www.youtube.com/embed/ckaQmJrx20Y) ## The 7 themes | Slug | Display | Plan | Best for | Vibe | | ---------- | -------------- | ---------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | `starter` | **Starter** | Free | Brand-new stores, simple catalogs | Clean, minimal, very fast | | `digital` | **Digital** | Free | **Digital goods only** — game top-ups, software licences, gift cards, e-books, online services | Dark, modern, product-dense | | `brico` | **Brico** | Free | Technical, hardware and artisan shops | Big category tiles, filters, mobile bottom nav | | `showcase` | **Started V2** | Pro | Multi-category brand catalogues | Full-width hero, promo banner, featured carousel, trust badges | | `prestige` | **Prestige** | Unlimited | Fashion, jewellery, luxury | Spacious, premium typography | | `promobi` | **Promobi** | Enterprise | Streetwear / fashion brands | Monochrome, scrolling marquee bands, giant outline brand title, centred-logo nav | | `bloom` | **Bloom** | Unlimited | Beauty & cosmetics | Pink full-width hero with badge, round category chips, "Chosen for you" carousel, soft pill cards | Digital is a mode switch, not a skin Activating **Digital** converts your store to digital-products mode. The storefront then stops collecting wilaya / commune / address, and shipping rates, courier integration and cash-on-delivery are disabled. Don't pick it for physical products — for tech and streetwear use Showcase or Promobi, and for beauty use Bloom. Themes above your plan `showcase` is Pro, `prestige` and `bloom` are Unlimited, `promobi` is Enterprise. Your theme keeps rendering even if the plan lapses — the layout is not reverted. What does change is the theme's default colour set: the colour layer falls back to Starter's defaults for any colour you never set yourself, and the theme card is locked in the picker until you upgrade. The slug is the theme's short name; the picker shows the display name. ## Where to switch theme **Dashboard → Themes** ([`/dashboard/themes`](https://dzbuild.com/dashboard/themes)). Click **Activer ce thème / تفعيل هذا القالب** on the theme card. Themes above your plan show a lock badge and a button named after the plan they need (for example **Passer à Pro / الترقية إلى Pro**), which opens [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) on that plan instead. Picking Digital opens a confirmation modal (with a 10-second cooldown before the confirm button unlocks) warning that the theme is for digital products only. That page has **three tabs**, not one: | Tab | What it sets | | -------------------------------- | -------------------------------------------------------- | | **Boutique / المتجر** | The 7 storefront themes above | | **Fast Checkout / الطلب السريع** | The look of the inline order form on the product page | | **Variantes / المتغيرات** | The look of the variant option cards on the product page | ### Fast Checkout themes | Theme | Plan | Style | | ------------- | ---------- | --------------------------------------------------------------------------------- | | **Classique** | Free | Default fast-checkout design — clear fields, customizable colours | | **Commerce** | Pro | Shopify-style e-commerce look — spacious fields, delivery cards, green buy button | | **Editorial** | Unlimited | Magazine aesthetic — editorial serif, thin rules, cream background | | **Compact** | Enterprise | Dense above-the-fold B2B layout — IBM Plex, sharp corners | | **Stepper** | Enterprise | Guided 3-step form with a progress bar and completion checks | ### Variant styles Twelve styles for the variant option cards, plus the free **Default** (no extra styling) option that every store starts on: | Plan | Styles | | ---------- | -------------------------------------- | | Pro | Minimal, Clay, Softplay, Stacked | | Unlimited | Editorial, Material, Offer | | Enterprise | Brutal, Glass, Luxe, Mashrabiya, Pixel | ### Customizing the theme you're on **Dashboard → Customize** ([`/dashboard/customize`](https://dzbuild.com/dashboard/customize)). There is **no** `/dashboard/customize/prestige` page — Prestige's options (hero, categories, featured, banner, branding, testimonials) appear as extra sections inside the normal customize page once Prestige is active, and every other theme works the same way. A legacy standalone `/dashboard/customize/digital` URL exists but is not linked from any menu and redirects to `/dashboard/customize` if your theme isn't Digital. ## What every theme lets you customize The customize page ([`/dashboard/customize`](https://dzbuild.com/dashboard/customize)) covers the basics across all themes: * **Header & Logo** — logo and favicon (Pro+ for the favicon). There is no separate social-card image; your logo is reused as the share image. * **Colours & font**: primary, secondary, background (Pro+), section titles (Pro+), font (Cairo / Tajawal / Almarai / Inter), button style. Live preview. * **Hero**: desktop and mobile hero *images* plus headline, sub-headline and CTA text/link on Starter, Showcase, Prestige, Promobi and Bloom. Brico has no hero block, and Digital uses its 3-slide hero slider instead. No hero video. * **Banners** — a promo banner on Showcase, Prestige and Bloom; two banners plus a 3-slide hero slider on Digital; none on Starter, Brico or Promobi. * **Featured products / categories**: you can toggle the blocks on/off and rename them. *Which* products appear is set by the **Featured product** switch on each product in the product editor. Starter shows the first 8; the other themes show every product you mark. Categories come from the Categories page. * **Product page order (Pro+)** — drag the product-page blocks (gallery, category, title, price, offers, variants, addons, buy buttons, fast checkout, description) into any order. * **Footer** — colour (Pro+), About text, copyright, social links (WhatsApp, Facebook, Instagram, TikTok, Telegram, GitHub), one custom link, and a "hide DZBuild branding" switch on Unlimited+. Cart pop-up wording is **fixed platform copy** in the store's single language (Arabic or French, set under Customize → Store language) and is not merchant-editable. Theme-specific extras appear as additional sections inside the same customize page once the theme is active. ## Switching themes — what carries over and what doesn't Your **products, categories, orders, customers, addons, domains, payment & shipping settings** all stay exactly where they are when you switch themes. Hero headline / sub-headline / CTA, section titles, the banner image, your colours and your featured-product picks are stored on the **store**, not on the theme, so they carry straight over and you do not need to re-enter them. A theme with no banner slot (Starter, Brico, Promobi) simply doesn't render one. Only the **Digital** theme's own layout data — hero slider slides, the two promo banners, the category strip, top sellers, popular-by-category and the multi-column block — is stored separately, and it is kept intact, so switching back to Digital restores it. **Two exceptions to "themes are presentation only":** 1. Switching **to** Digital converts your store to digital-products mode and rewrites any colours still sitting at their defaults to Digital's dark palette (white background → `#0a0a1a`, white navbar → `#0f0f23`, `#1f2937` footer → `#06060f`, dark section titles and navbar text → light). Colours you chose yourself are left alone. Primary and Secondary change only while they still hold the colours your store was created with (`#1a1a2e` / `#16213e`); they become `#6366f1` / `#818cf8`. 2. Switching a Digital store **away** from Digital converts it back to a physical store — the digital-products pages, the digital order flow and the digital payment paths stop working until you switch back. Digital and pure white Digital is a dark theme, and it force-overrides a pure-white background or navbar back to its dark defaults. If you want a light background on Digital, use an off-white such as `#fefefe` — it sticks. ## Theme-specific add-ons Some addons are designed around a specific theme: * The **Digital Product Variants** addon (Pro plan, Digital theme only) replaces Digital's variant selector with a collapsible accordion in which each option shows its name, its final price (base + adjustment) and — for colour variants that carry a colour code — a colour dot. It does **not** show per-option preview images; in fact it *removes* them, because Digital's built-in picker already renders a thumbnail and a price pill for any option flagged **show as card**, and the addon hides that native picker and rebuilds the UI itself. See [the Digital theme guide](https://dzbuild.com/docs/storefront/digital-theme.md). * The **Stop Desk Selector** addon adds a structured stop-desk picker to checkout on every theme except Digital, which has no delivery step. See the [addons section](https://dzbuild.com/docs/addons/overview.md) for the full catalog. ## Custom CSS The Enterprise plan exposes a **Custom CSS** field in the customize page. CSS you put there is loaded *after* the theme stylesheet, so your rules win. See the [Custom CSS guide](https://dzbuild.com/docs/storefront/custom-css-guide.md) for templates and a primer. ``` /* Round the "add to cart" buttons in product grids */ .add-to-cart { border-radius: 999px; } /* Softer product-card corners */ .product-card { border-radius: 16px; } ``` Search-box and hero selectors are **theme-specific and homepage-only**: `.brico-search`, `.sc-search` (Showcase and Bloom), `.pr-search`, `.pm-search`, `.search-section` (Starter and Digital). Inspect your own storefront before writing a rule against them. `.btn-primary` exists only on the order-confirmation page, not on the buttons most merchants want to restyle. If a CSS edit makes your storefront look broken, clear the field and save to revert — there's no destructive change. ## Frequently asked **Q: Will switching themes lose my data?** A: No. Products / orders / settings persist. The two exceptions above apply to Digital only. **Q: Will my custom domain still work?** A: Yes. Domains are tied to your store, not your theme. **Q: Can I switch back to my previous theme?** A: Yes. Hero copy, section titles, banners and colours are shared across themes, so your layout returns. One caveat: if you try **Digital** and switch back, any colours that were still at their defaults will have been rewritten to Digital's dark palette and are not restored. Re-set your primary, secondary, background, navbar, footer, section-title and navbar-text colours by hand. (Reset would also do it, but remember Reset permanently deletes your uploaded logo, favicon and hero image.) **Q: Can I make my own theme?** A: First-party themes only for now. The customize page + Custom CSS cover most needs; for a fully bespoke design talk to support about Enterprise. --- Source: https://dzbuild.com/docs/getting-started/create-account.md # Create your account Signing up to DZBuild takes less than a minute. No credit card required and no commitments: the store you create next starts on a **3-day Pro trial**. DZBuild is paid for by subscription and takes no commission on your sales. The trial belongs to the **store**, not to your user account: a newly created store starts on the Pro plan with an expiry date 3 days out. It runs 3 days, once per store, and cannot be extended, frozen or restarted. A user account by itself has no plan. (The Free plan is not for sale. If you signed up through a DZBuild Free-plan offer link, your first store starts on Free instead of the trial; otherwise only DZBuild staff can put a store on it.) ## 🎬 Video — sign-up walkthrough [DZBuild sign-up walkthrough](https://www.youtube.com/embed/9erR8vHwyS0) ## Step by step ### 1. Visit the registration page Go to [dzbuild.com/register](https://dzbuild.com/register). ### 2. Fill in your details | Field | What to enter | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **First name** | Your real first name, 2 to 50 characters, or up to 25 letters when written in Arabic (used for support correspondence and order receipts) | | **Last name** | Your real last name, 2 to 50 characters, or up to 25 letters when written in Arabic | | **Email** | A working inbox — we send order notifications, password resets and billing receipts here | | **Phone** | An Algerian mobile: 10 digits starting with `0` (`0676883478`) or 12 digits starting with `213` (`213676883478`). Stored for support contact and pre-filled into courier shipments | | **Password** | Between 8 and 100 characters; we recommend a mix of letters, numbers and a symbol | ### 3. Tick the verification box, then submit Above the **Create a free account** button sits a verification box that you tick yourself. Tick it, wait a second or two for it to settle, then submit. The form holds your submission until that check has passed, so a button that appears to do nothing usually means the box has not been ticked yet. ### 4. Enter the code we email you Submitting the form creates your account and sends a **6-digit code** to the address you typed in. You land on `/verify-email`, enter the six digits there, and only then continue to the store-creation screen at `/store/create`. * The code is valid for **15 minutes**. * **Resend the code** sits on the same page and unlocks 60 seconds after the last send. * If the mail is not in your inbox, check the spam folder and search your mailbox for `dzbuild`. The email carries the code only. There is no link to click. ### Why a signup can be rejected The register form is stricter than it looks. It will refuse: * **Disposable / temp-mail addresses** — throwaway inbox domains are refused. Use a real inbox you can actually receive mail at. * **Email addresses we can't deliver to** — if the address can't receive mail, it is rejected. * **Likely typos** — something like `gmil.com` is rejected with a suggested correction rather than silently accepted. * **Names outside 2–50 characters** for either first or last name. * **Passwords under 8 characters.** * **Signups flagged by our automated abuse checks** — the form may refuse the attempt or ask you to confirm you are not a bot. If you believe that is a mistake, contact support. tip Use a real, working email address — you'll need it for password recovery, order notifications, and any billing receipts. You can change it later in **Dashboard → Account**, but it is a *request* that has to be confirmed before it takes effect, not an instant inline edit. The same applies to changing your phone number. ## What happens after sign-up Once the code is accepted you land on the **store creation** screen automatically. Pick a name, a slug, the store type and a default language, and your store is provisioned in seconds. See [Set up your first store](https://dzbuild.com/docs/getting-started/first-store.md). ## Signing up through a referral link If you arrived through an affiliate's referral link, your account is attributed to that affiliate at the moment of registration. Attribution is written **once** and cannot be changed afterwards. See [Affiliate program](https://dzbuild.com/docs/operations/affiliate.md) if you want to refer merchants yourself. ## Account safety * Passwords are hashed with bcrypt — even our staff can't read them. * We **never** ask for your password by email or chat. Anyone claiming to be DZBuild support and requesting your password is a phisher; report them via the [contact form](https://dzbuild.com/contact). * **Two-factor authentication is available right now, on every plan.** Turn it on from **Dashboard → Account**: scan the QR code with an authenticator app (or enter the manual key), then download your backup codes. The same page lists every device signed in to your account and lets you revoke them one by one or all at once. ## Closing your account Deleting an account and its stores goes through support, not through a button in the dashboard. Open a ticket and attach a screenshot of the account settings page in the app showing the email address linked to the account, plus the phone number if you have one on file. Once the team has confirmed it is your account, it is deleted in full after 30 days. ## Troubleshooting **Q: The Create a free account button does nothing.** A: The form will not submit until the verification box above the button is ticked and its check has finished. Tick it, give it a couple of seconds, then press the button again. **Q: The verification keeps failing and I cannot get past it.** A: Open the registration page in a fresh tab, turn any VPN off, and enter the emailed code within a few minutes of asking for it. If it still loops, open a support ticket and tell us the email address you used and which browser you are on. **Q: I signed up with Google and now a page asks for my current password.** A: When you sign up with Google we email you a password for the account. Check your inbox and your spam folder, and search your mailbox for `dzbuild`. If it is nowhere, use **Forgot password** on the login page to set a new one. **Q: My phone number gets rejected.** A: Use the local format starting with `0` (e.g. `0676883478`), or the 12-digit form starting with `213` (`213676883478`). Anything else is refused. **Q: I already have an account.** A: Log in at [dzbuild.com/login](https://dzbuild.com/login). --- Source: https://dzbuild.com/docs/getting-started/dashboard-tour.md # Dashboard tour The DZBuild dashboard is your command center for everything: products, orders, customers, marketing, billing, themes, addons, custom domains. This page walks through every section so you know where things live. ## Top bar * **Language switcher** — Arabic ⇄ French for the dashboard interface. * **Light / dark theme toggle.** * **Android app link** — shown only when you open the dashboard on an Android device. * **View store** — opens your live storefront in a new tab. * **Profile dropdown** — Account settings, Help center (these docs), Logout. There is no notification bell The dashboard has no notification bell and no notification feed. `/dashboard/notifications` is where you configure **where** new-order alerts are delivered (browser/app push, email, Telegram, Discord), not where you read them. A new order does pop as a **live toast** without refreshing, but only on two pages: the orders list at `/dashboard/orders` and the Advanced Orders page. The dashboard home shows no toast, but it adds the new order to its recent orders and updates its counters without a refresh. Other dashboard pages show nothing, so keep the orders list open if you want the toast. The **store picker** lives in the sidebar, not the top bar — see [Multi-store](#multi-store) below. ## Sidebar — every section, with paths | Section | Path | What it does | | ------------------------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Home** | `/dashboard` | KPIs at a glance — today's revenue, orders, top products. | | **Products** | [`/dashboard/products`](https://dzbuild.com/dashboard/products) | List, search, filter, edit, hide, set Draft, and bulk-delete or bulk-update products. There is no archive action. | | Create product | [`/dashboard/products/create`](https://dzbuild.com/dashboard/products/create) | Form to add a new product. | | Bulk import | [`/dashboard/products/bulk-import`](https://dzbuild.com/dashboard/products/bulk-import) | Upload many products from a `.csv`, `.xlsx`, `.xls` or `.ods` file (max 10 MB, 5,000 rows). | | Categories | `/dashboard/categories` | Group products into categories shown on the storefront. | | Product addons | `/dashboard/product-addons` | Per-product upsells / cross-sells. | | **Orders** | [`/dashboard/orders`](https://dzbuild.com/dashboard/orders) | Every order and its status — pending → confirmed → processing → shipped → delivered. Send single or bulk orders to a courier. | | Advanced orders | [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced) | CRM-style order management — sub-statuses, logged call attempts, change history (requires the *Advanced Order Management* addon). | | **Customers** | [`/dashboard/customers`](https://dzbuild.com/dashboard/customers) | Buyers across all orders, plus a fraud console: a per-customer fraud score, a blacklist view, and ban / unban for repeat no-show buyers. | | **Landing pages** | [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages) | One-page mini-sites for paid ads. | | Create landing page | `/dashboard/landing-pages/create` | Hand-built landing-page editor. | | AI-generate landing page | `/dashboard/landing-pages/ai-generate` | Generate a landing page from a short brief. | | A/B tests | `/dashboard/ab-tests` | Split one link's traffic between landing pages and keep the winner (requires the *A/B Testing* add-on). | | **Abandoned carts** | [`/dashboard/abandoned-carts`](https://dzbuild.com/dashboard/abandoned-carts) | Carts your customers started but didn't finish — with recovery tools. | | **Promo codes** | [`/dashboard/promo-codes`](https://dzbuild.com/dashboard/promo-codes) | Percentage or fixed discounts, minimum order amount, a total usage cap across all customers, start date and expiry. There is no per-customer usage limit. | | **Reviews** | [`/dashboard/reviews`](https://dzbuild.com/dashboard/reviews) | Moderate customer reviews (requires the *Product Reviews* addon). | | **Pixels** | [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels) (and `/dashboard/pixels/multi`) | Facebook, TikTok, Snapchat and Pinterest pixels, Google Analytics, Google Tag Manager and Google Ads tags, plus Conversions API. | | **Shipping rates** | [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) | Per-wilaya home and stop-desk prices, free-shipping thresholds, wilaya modes. | | **Link couriers** | [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping) | Connect a courier account with its API credentials. The grid holds 102 tiles (Yalidine, Yalitec, Guepex, Easy & Speed, Maystro, ZR Express, Abex Express, NOEST, Zimou, Colivraison, Ecom Delivery, DHD, Conexlog, MSM Go and more), and one of those 102 is a custom-Ecotrack tile for any courier running on the Ecotrack platform. | | **Domains** | [`/dashboard/domains`](https://dzbuild.com/dashboard/domains) | Connect your custom domain. See [Custom domain](https://dzbuild.com/docs/customizing/custom-domain.md). | | **Themes** | [`/dashboard/themes`](https://dzbuild.com/dashboard/themes) | Pick one of the 7 storefront themes (Starter, Brico, Digital, "Started V2"/Showcase, Prestige, Bloom, Promobi), each with its own minimum plan. The same page hosts the Fast-Checkout theme picker. | | **Customize** | [`/dashboard/customize`](https://dzbuild.com/dashboard/customize) | Live editor — colors, fonts, hero, banners, footer. Every theme except Digital is edited here, Prestige included. | | Customize Digital | `/dashboard/customize/digital` | The one theme with its own separate editor page. | | **Addons** | [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) | 25 add-ons ship with the platform. Twenty of them render as installable cards you switch on here. Product Reviews, Facebook Catalog and A/B Testing sit in the **Management tools** section instead, alongside Team, Google Sheets, Product Add-ons and two built-in toggles that are not add-ons at all (Promo Codes, Countdown & Urgency); the Claude and ChatGPT add-ons sit under **External platforms**, next to the Ecomanager, FlashManager and Octomatic connections. Cards are plan-gated. | | **Stock management** | `/dashboard/stock-management` | Advanced stock tracking (requires the *Advanced Stock Management* addon). | | **Short links** | `/dashboard/short-links` | Branded short URLs (requires the *Short Links* add-on). | | **Webhooks** | `/dashboard/webhooks` | Push store events to n8n, Make, Zapier or your own endpoint (requires the *Webhooks* add-on). One endpoint on Unlimited, three on Enterprise. | | **WhatsApp messages** | `/dashboard/whatsapp-sender` | Automatic WhatsApp messages to your buyers about their order (requires the *WhatsApp Sender* add-on). | | **Min / max quantity** | `/dashboard/min-max-quantity` | Per-product order quantity rules (requires the *Min-Max Quantity* add-on). | | **Pickup points** | `/dashboard/pickup-points` | Your own shops as a collection option at checkout (requires the *Pickup from Store* add-on). | | **Advanced analytics** | `/dashboard/addons/advanced-analytics` | Deeper reporting (requires the *Advanced Analytics* add-on). | | Digital orders | `/dashboard/digital/orders` | Orders for digital-product stores. | | Digital payment | `/dashboard/digital/payment` | Buyer payment methods for digital stores: CIB / Edahabia card through your own Slick-Pay account, CCP, BaridiMob, Redot Pay or a custom method. | | Digital storage | `/dashboard/digital/storage` | Files you deliver to buyers, and your storage usage. | | Digital checkout fields | `/dashboard/digital/checkout-fields` | Which fields the digital checkout asks for. | | **Subscribe** | [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) | Your plan, upgrade options, payment receipts. | | **AI credits** | [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) | Buy credits used by the AI landing-page generator. | | **Affiliate** | `/dashboard/affiliate` | Refer other merchants to DZBuild and earn commission. | | **API** | `/dashboard/api` | API keys for the DZBuild API. See the [API Reference](https://dzbuild.com/api-docs/intro.md). | | **Developers** | `/dashboard/developer` | Create apps that connect to DZBuild stores with their owners' approval. Guides for building those apps are on [dzbuild.dev](https://dzbuild.dev). | | **Account** | `/dashboard/account` | Your name, email, phone and password, plus two-factor authentication (available on every plan) and the list of devices signed in to your account. | | **Team** | [`/dashboard/team`](https://dzbuild.com/dashboard/team) | Invite collaborators with scoped permissions. | | **Notifications** | `/dashboard/notifications` | Notification channels — turn browser/app push, email, Telegram and Discord alerts on or off, connect your Telegram bot, and manage which devices receive push. There is no notification history. | | **Settings** | [`/dashboard/settings`](https://dzbuild.com/dashboard/settings) | Store-wide settings. | | **Copilot** | `/dashboard/copilot` | Chat with DZBuild Copilot; its points page is `/dashboard/copilot/points`. See [DZBuild Copilot](https://dzbuild.com/docs/copilot/overview.md). | | **Community & support** | `/dashboard/community` | Live chat with the team, tickets and the merchant community. See [Support](https://dzbuild.com/docs/operations/support.md). | Three things about this list: * The add-on-driven pages (Advanced orders, Advanced analytics, A/B tests, Reviews, Stock management, Short links, Webhooks, WhatsApp messages, Pickup points, Min/max quantity) only appear in the sidebar once the matching add-on is active. * Promo codes, Team and Product addons have no sidebar entry of their own: open them from their cards in **Addons → Management tools**. AI credits opens from the landing pages screens. * The `/dashboard/digital/*` group appears, and **Shipping rates** and **Link couriers** disappear, on stores using the **Digital theme**. When the plan expires An expired plan takes the storefront offline for buyers, and until you renew the dashboard narrows to a few pages: home, subscribe, settings, account, notifications, affiliate, AI credits and domains. Nothing is deleted: your products, orders and settings are waiting when the plan is active again. ## What to do first If your store is brand new, here's the recommended order: 1. **Add 2-3 real products** with proper photos. See [Add your first product](https://dzbuild.com/docs/getting-started/first-product.md). 2. **Set up shipping rates** in [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) (per wilaya or flat), then **link a courier account** in [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping). 3. **Nothing to connect for payments** on a physical-goods store: every order is [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md) and checkout has no payment-method step. Digital-product stores instead configure buyer payment methods at `/dashboard/digital/payment`: CIB / Edahabia card through your own Slick-Pay account, or a manual method (CCP, BaridiMob, Redot Pay or a custom method) where the buyer transfers and uploads a receipt. 4. **Customize your storefront** — pick a theme in [`/dashboard/themes`](https://dzbuild.com/dashboard/themes), set your colors and logo in [`/dashboard/customize`](https://dzbuild.com/dashboard/customize). 5. **Place a test order** as a customer to see the full flow end to end. 6. **Connect your Facebook Pixel** in [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels) before you launch ads. 7. (Optional) **Connect your custom domain** in [`/dashboard/domains`](https://dzbuild.com/dashboard/domains) once you're happy with the store. ## Multi-store If you own more than one store, switch between them from the store picker in the sidebar. Mutations always target the **selected** store — make sure the right one is selected before bulk-editing or importing. The picker is hidden entirely if you own a single store and are not currently eligible to create another. Switching can also move you to a different page: if the store you switch to is a different type, the dashboard retargets you (orders ⇄ digital orders) or sends you back to `/dashboard`. ## Getting the dashboard on your phone The live toast only fires on the orders list and the Advanced Orders page, so it is no substitute for a real alert channel. Away from the desk you have two options: install the dashboard as a **PWA** from your mobile browser, or download the official **Android app**, whose link appears in the dashboard top bar when you browse from an Android device. Both can receive push notifications once you enable push at `/dashboard/notifications`, and Telegram is the channel most Algerian merchants end up relying on. --- Source: https://dzbuild.com/docs/getting-started/first-order.md # Receive your first order When a customer places an order, you're notified instantly and the order moves through a state machine you control from the dashboard. This page walks through the full flow — what the customer sees, what you do, and how the order ends up at the customer's door. ## 🎬 Video — order flow walkthrough [DZBuild order flow](https://www.youtube.com/embed/H0cRjgs77VA) ## What the customer does 1. Lands on your storefront (`{your-slug}.dzbuild.app` or your custom domain). 2. Picks a product, picks variants if any, and adds to cart. 3. Proceeds to checkout, fills in name, phone, wilaya and commune, plus the street address for home delivery. 4. Picks a delivery mode and confirms. 5. Sees a "thank you" page with their order number. That's it from the customer's side. They don't need an account to place an order. Three delivery modes are possible at checkout: * **Home delivery** — always available. * **Stop desk** — only in the wilayas where you enabled desk delivery in your shipping rates. The searchable list of the courier's actual desks appears only if the [Stop Desk add-on](https://dzbuild.com/docs/addons/stop-desk.md) is active *and* the linked courier has synced its desk data; otherwise it degrades to plain desk delivery at your desk price. * **Pickup from your own shop** — requires the Pickup from Store add-on and at least one configured pickup point. The order may take a few seconds to appear Checkout confirms to the buyer immediately and the order is recorded right after, so a few seconds before it shows in your orders list is normal. If an order the buyer insists they placed never turns up at all, take their phone number and the time they ordered, enter the order yourself from the orders page at `/dashboard/orders`, and open a support ticket with those details so the team can look it up. ## The order lifecycle ``` pending → confirmed → processing → shipped → delivered ↓ cancelled (any non-terminal state) ↑ returned (parcel sent back by the courier) ``` | Status | What it means | Who triggers it | | ------------ | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | `pending` | Order placed, not yet confirmed | Customer at checkout | | `confirmed` | You called the customer and verified | You (dashboard) | | `processing` | You're packing the order, or you sent it to a courier | You (dashboard), or automatically when you send the order to a courier | | `shipped` | The courier has it in transit | The delivery-tracking sync, reading it back from the courier | | `delivered` | Customer received it | The delivery-tracking sync, or you | | `cancelled` | Order cancelled before delivery | You, or the delivery-tracking sync when the courier cancels the parcel | | `returned` | The parcel is on its way back to you or already back, for example after the buyer refused it | The delivery-tracking sync, or you | When stock moves By default, stock is committed the first time an order reaches **any** of `confirmed`, `processing`, `shipped` or `delivered`, never at `pending`, so you don't lose inventory to fake or spam orders. If you would rather reserve stock the moment an order arrives, open the Orders page, click the display settings gear and set **Stock deduction** to **On order receipt**; the store owner and members allowed to edit orders can change it, and it applies to orders placed from then on. Sending a still-pending order straight to a courier moves it to `processing`, which deducts stock too. Stock is restored when an order becomes `cancelled`, or when you set it to `returned` yourself, whichever timing you use. A return reported by the courier gives the stock back once the courier says the parcel is back with you, when you press **Return received** on the order (or tick several returns and use **Returns received**), or by itself 15 days after the courier reported the return, whichever comes first. However many times you flip an order's status back and forth, a deduction and a restore always alternate, so the order's stock is never taken twice in a row or given back twice in a row. Re-confirming an order you cancelled takes its stock again. ## What you do ### 1. You get notified When an order comes in: * **Live toast**: instantly and without a refresh, but only on the orders list at `/dashboard/orders` and on the Advanced Orders page. No other dashboard page shows it, so keep the orders list open if you rely on it. * **Telegram** — to one or more connected accounts. This is the channel most Algerian merchants actually use; connect it from `/dashboard/notifications`. * **Discord** — same page, if you run your operations in a Discord server. * **Email**: to your account email, the address shown on `/dashboard/notifications`. To change it, edit your account email on `/dashboard/account`. * **Browser / app push** — Web Push in the browser, and native push in the Android app. * **Webhook** — via the Webhooks add-on. See [Webhooks](https://dzbuild.com/api-docs/webhooks/overview.md). Push has its own switches Turning email notifications off at `/dashboard/notifications` does not stop browser or app push. New-order push reaches every browser and phone where you switched push on, and the **Status change** switch on the push card adds a push alert when you or your team change an order's status. Status updates read from the courier do not send one. ### 2. Open the order **Dashboard → Orders** ([`/dashboard/orders`](https://dzbuild.com/dashboard/orders)) → click the new order. ### 3. Call-confirm Most Algerian stores run a **call-confirm** flow: pending orders sit until you call the customer, verify they actually meant to order, then move the order to `confirmed`. It is the habit worth building first: the parcels that come back refused are usually the ones nobody called about. For a CRM-style call-confirm UI, install the [Advanced Orders addon](https://dzbuild.com/docs/addons/advanced-orders.md) and use [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced). It is also the only place with a real per-order history: it records sub-statuses (no answer, busy, postponed, fake, …), logs every call attempt, and keeps a full change history. ### 4. Send to courier First, the prerequisite: link a courier account with its API credentials at **Dashboard → Link couriers** ([`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)). Then: 1. Open the order — either from the preview popup in the orders list, or from the full order page. 2. Click **send to delivery** and pick the linked courier. 3. The courier API returns a tracking number and a shipping label, both stored on the order. You can print the courier's label / QR straight from the order afterwards. 4. The order's status moves from `pending` or `confirmed` to **`processing`** — not `shipped`. The orders list also lets you tick several orders and send them to a courier in one bulk action. DZBuild sends **no SMS** to your customer at any point. If the buyer receives one, it comes from the courier's own system. The courier grid holds 102 tiles: Yalidine, Yalitec, Guepex, Easy & Speed, Maystro, ZR Express, Abex Express, NOEST Express, Zimou Express, Colivraison, Ecom Delivery, DHD Livraison, Conexlog, MSM Go and more. Any courier running on the Ecotrack platform goes through the "custom Ecotrack" tile, which is one of those 102. Which wilayas you can actually ship to is decided by your own account with the courier, not by DZBuild. See [Couriers overview](https://dzbuild.com/docs/couriers/overview.md). ### 5. Watch it through to delivered Most courier integrations sync the delivery status back automatically: DZBuild checks the courier for updates about every 15 minutes and flips the order to `shipped` and later `delivered` on its own. Expect roughly a quarter of an hour after the courier updates its own system, not an instant change, and expect a longer gap on a store with many open shipments, since each check works through a limited batch of them. For couriers without automatic sync, change the status by hand once the courier confirms delivery to you, by phone, through their portal, or by their own message. Each order also shows where the buyer came from, so you can see which channel produced it. ## When an order never arrives If a customer says they ordered but nothing shows in your dashboard, there are four things that can block an order before it reaches you: * **The checkout captcha** — if the [Captcha Protection add-on](https://dzbuild.com/docs/addons/captcha-protection.md) is active, checkout runs an automatic verification check and a buyer who submits before it finishes gets nothing through. * **The fraud / ban gate** — buyers you have banned are refused before an order is ever created. * **The per-IP order limit** — if you installed the *Limit Orders per IP* add-on, repeated orders from one IP are blocked. * **The Free-plan cap** — a Free store stops accepting orders after **30 orders in a calendar month**, and the storefront closes to all visitors until the next month or until you subscribe. ## What's next * [Set up couriers](https://dzbuild.com/docs/couriers/overview.md) * [Recover abandoned carts](https://dzbuild.com/docs/selling/abandoned-carts.md) * [Try the Advanced Orders addon](https://dzbuild.com/docs/addons/advanced-orders.md) * [Set up a Stop Desk picker](https://dzbuild.com/docs/addons/stop-desk.md) --- Source: https://dzbuild.com/docs/getting-started/first-product.md # Add your first product Prepare a photo, a name and a selling price. You can save the product as a draft while you finish it. Our example is **sports shoes at 2,500 DA**, with **20 pairs** in stock. These are real French dashboard screenshots with demonstration values. French labels appear beside the English instructions. ## 🎬 Video — products end to end [Adding products in DZBuild](https://www.youtube.com/embed/o5rHtd_Pgus) ## 1. Open the product form Open **Dashboard → Products → Add product**, or [open the form directly](https://dzbuild.com/dashboard/products/create). On a phone, scroll down to reach the images, stock and status sections. ## 2. Add a photo In **Product images** (*Images du produit*), press the upload area and choose a photo from your device. Wait for its thumbnail. ![Uploaded product photo with its Primary badge](/assets/images/fr-product-image-0759b9131f068c931d9a8a54688f3a4e.png) **Check:** your photo appears. The **Primary** (*Principale*) photo is used on the product card. Select another photo's star to make it the primary image. ## 3. Enter the name and description In **Product name** (*Nom du produit*), enter a short name such as **Sports shoes**. In **Description**, explain what the buyer will receive. Mention the material, sizes and anything they need to know before ordering. ![Product name and short description entered in the dashboard](/assets/images/fr-product-details-70a4b2b9452cd12ee3b5ae8acdebdaaf.png) You can complete optional details later. The description generator is optional too. ## 4. Set the price and quantity In **Pricing & stock** (*Prix et stock*): 1. Enter **2500** in **Price** (*Prix*). 2. Leave **Compare price** (*Prix avant remise*) empty if you are not showing a discount. 3. Turn on **Track stock** (*Suivi du stock*). 4. Enter **20** in **Available quantity** (*Quantité disponible*). ![Selling price 2500 DA and stock tracking enabled with 20 units](/assets/images/fr-product-stock-24ec5950e6a78f19da4139db05cea080.png) **Check:** the price is 2,500 DA and the quantity is 20. A compare price must be higher than the selling price. **Cost** is your purchase cost, not the amount the buyer pays. Several colours or sizes? Follow [Variants and combinations](https://dzbuild.com/docs/selling/variants.md) next. Use combination stock if each colour and size has its own quantity. ## 5. Choose the status and save In **Category & status** (*Catégorie et statut*), choose a category if you have one, then select the status: | Status | Result | | ------------------------------------------- | --------------------------------------------------------------------- | | **Draft** (*Brouillon*) | Saved for you to finish. Shoppers cannot see it. | | **Active** (*Actif*) | Listed in the store and available to buy. | | **Active but hidden** (*Actif mais masqué*) | Buyable through its direct link, without appearing in store listings. | ![Draft status selected to keep the product invisible to shoppers](/assets/images/fr-product-status-ea7e81a6534a0abf8a156935d93f12b2.png) Choose **Draft** while you practise. Press **Add product** (*Ajouter le produit*) once and wait for the products list. ## 6. Check the saved product Find the product in **Products** and open **Edit**. Check the name, photo, price and quantity. When ready, change the status to **Active** and save. Use **Preview in store** to check what the buyer sees. **Finished:** the product is saved with the correct photo and price. If you published it, its storefront page opens. ## If you get stuck | Problem | What to do | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | A photo is required | Choose a photo and wait for its thumbnail. | | Compare-price error | Clear that field or enter a price higher than the selling price. | | Stock quantity is disabled | Variant stock is on. Enter quantities in the options or combination table. | | Product missing from the storefront | Check the Active status. Draft and hidden products do not appear in listings. | | Save error | Keep the form open and correct the named field. If you are unsure whether it saved, check the products list before submitting again. | ## Continue * [Add colours, sizes and stock for each combination](https://dzbuild.com/docs/selling/variants.md) * [Update stock when new items arrive](https://dzbuild.com/docs/addons/stock-management.md) * [Manage photos, prices and existing products](https://dzbuild.com/docs/selling/products.md) --- Source: https://dzbuild.com/docs/getting-started/first-store.md # Set up your first store After signing up, you land on the store-creation form. This page walks through every field and what you can change later. ## What you'll choose ### 1. Store name Pick a name that reflects your business. This is what shows in the storefront header, in customer emails, and on the order receipt. Examples: * *"متجر الأناقة"* * *"TechShop DZ"* * *"Boutique Sara"* You can rename your store later from **Dashboard → Settings**. ### 2. Store URL (slug) This becomes your free DZBuild subdomain. Your storefront will be reachable at: > `https://{your-slug}.dzbuild.app` For example, if you pick the slug `boutique-sara`, your storefront lives at `https://boutique-sara.dzbuild.app`. | Rule | Why | | --------------------------------------------- | ------------------------------------------------------------------------ | | Lowercase letters, numbers, and `-` only | URL-safe and search-engine friendly | | 3 to 30 characters | Short and memorable — a 31-character slug is rejected | | Must start **and** end with a letter or digit | A leading or trailing `-` is removed for you, so `-shop-` becomes `shop` | | No spaces, underscores, or non-ASCII letters | URLs only support ASCII | These names are reserved and cannot be used as a slug: `www`, `admin`, `api`, `app`, `mail`, `smtp`, `ftp`, `cdn`, `static`, `assets`, `dashboard`, `login`, `register`, `auth`, `account`, `help`, `support`, `blog`, `news`, `docs`, `developer`. warning Your slug **cannot be changed** after the store is created. Pick something you'll be happy with for the long term. If you later want to use your own domain like `mybrand.com`, see [Custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) — that's a completely separate setup from your slug. ### 3. Store type — physical or digital This is the most consequential choice on the form, and it is the one merchants overlook. * **Physical products** — the normal Algerian COD store. Your store is created on the **Showcase** theme (it appears in the picker as *"Started V2"*), and the dashboard shows the full shipping stack: **Shipping rates** and **Link couriers**. * **Digital products** — downloads, licences, services. Your store is created on the **Digital** theme. The sidebar follows the theme: a store on the Digital theme **loses** the shipping and link-couriers menus and **gains** the digital group — `/dashboard/digital/orders`, `/dashboard/digital/payment`, `/dashboard/digital/storage` and `/dashboard/digital/checkout-fields`. Because that swap keys off the theme, switching a digital store away from the Digital theme later also removes those menu items. ### 4. Default language Pick the language your storefront renders in: **Arabic** or **French**. These are the only two options; DZBuild has no English storefront or dashboard locale. You can change it later from **Dashboard → Customize**. By default this is not a preference your customers can override: there is no language switcher on the storefront. A customer-facing selector — with browser-language detection and a cookie-persisted choice — requires activating the [Multi-Language Store add-on](https://dzbuild.com/docs/addons/multi-language.md), which needs the **Unlimited** plan or higher. That is the whole form: name, slug, store type, language. There is no description field and no currency field on it. The store description is edited afterwards from **Dashboard → Settings**, and DZD is the platform-wide currency, not a setting. ## What you get out of the box Your store is **live immediately** at `{your-slug}.dzbuild.app` with: * Your starting theme applied — **Showcase** ("Started V2") for a physical store, **Digital** for a digital one. Six other themes are available from **Dashboard → Themes**, most of them plan-gated: Starter, Brico and Digital are free, Showcase needs Pro, Prestige and Bloom need Unlimited, Promobi needs Enterprise. Digital is reserved for digital-product stores — the dashboard warns that it does not support physical products with delivery, and switching to it turns your store into a digital store. * A **3-day Pro trial**: every feature of the Pro plan, no card required. A first store opened after signing up through a DZBuild Free-plan offer link starts on the Free plan instead. * All [supported couriers](https://dzbuild.com/docs/couriers/overview.md) ready to be configured. * Cash on Delivery (COD) enabled by default. * A sample category and a sample T-shirt product with color and size options, so the storefront is not empty. Edit or delete them when you add your own products. * Starting home and stop-desk delivery prices for all 58 wilayas. On a physical store, review them in **Dashboard → Shipping rates** before you sell. ## Store settings After the store exists, you edit its details on one page: **Settings → Store settings** in the dashboard sidebar (`/dashboard/settings`). The top of the page shows your store link, the address buyers use to reach your store. | Section | Fields | What to know | | ------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Store information** | **Store name**, **Store description** | The name is required: the page refuses to save without it. | | **Location** | **Wilaya**, **Commune**, **Address** | Couriers of the Yalidine family need the wilaya: their rate sync refuses to run without it, and it is sent as the departure wilaya of your parcels. See [Yalidine](https://dzbuild.com/docs/couriers/yalidine.md). | | **Contact details** | **Phone number**, **WhatsApp**, **Store email** | Shown to buyers on your storefront, see below. | | **Search engine optimization (SEO)** | **Google verification code**, **Bing verification code** | For Google Search Console (paste only the `content` value of its HTML tag) and Bing Webmaster Tools. See [SEO](https://dzbuild.com/docs/marketing/seo.md). | Click **Save changes** at the bottom of the form. ### Where buyers see your contact details A contact line appears only when its field is filled in: * **Storefront footer**: the Contact us column lists the phone number (tap to call), the store email (opens the buyer's mail app) and the WhatsApp number (opens a chat). On the Brico theme, the home page lists the phone number and store email in its own Contact us section instead; the other pages of the store show this footer. * **Mobile drawer**: a WhatsApp link and the phone number (tap to call). * **Order-confirmation page**: your WhatsApp number, as the contact for questions about the order. Leave **WhatsApp** empty and this page shows no contact at all. Type the phone and WhatsApp numbers the way you dial them, for example `05XXXXXXXX`. The WhatsApp links on your storefront add Algeria's `213` code for you. ### Store status card The **Store status** card on the same page shows your **Current plan** and the store's **Creation date**. On any plan other than Free it also shows the **Subscription expiry date** with the days left, or an **Expired** badge once that date has passed. ## Where to go next 1. [Tour the dashboard](https://dzbuild.com/docs/getting-started/dashboard-tour.md) 2. [Add your first product](https://dzbuild.com/docs/getting-started/first-product.md) 3. [Customize your storefront](https://dzbuild.com/docs/customizing/themes.md) 4. [Pick and connect a courier](https://dzbuild.com/docs/couriers/overview.md) 5. [Connect a custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) — when you're ready to use your own brand domain ## Multiple stores DZBuild supports multi-store under one account. All stores share the same login and the same dashboard — switch between them from the **store picker** in the dashboard sidebar. Each store has its own products, customers, orders, theme, addons, plan and custom domain. The rules for creating another store: * The hard cap is **50 stores per account**, and it is almost never what stops you. * The real gate: you can only create a new store once **every** store you already own is on an active, unexpired paid plan (Pro, Unlimited or Enterprise). One expired store, one store left on Free, or one store still on its 3-day trial (a store counts as paid only after a plan payment for it goes through) blocks creation with *"to create an additional store, all your current stores must be on a paid plan"*. * There is a **5-minute cooldown** between creations, and repeated attempts in quick succession are throttled. * After you create a store, you are switched to it automatically and the choice is remembered across devices and sessions — so the very next thing you edit belongs to the new store, not the old one. * The store picker is hidden entirely for single-store merchants who are not currently eligible to create another. ## Frequently asked **Q: I picked the wrong slug. Can you change it?** A: Slugs aren't editable. Either work with what you have or create a second store with the right slug (subject to the multi-store rules above). The simpler long-term answer is to attach a [custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) — your customers will never see the slug. **Q: What happens after the 3-day Pro trial?** A: Nothing is downgraded and nothing is deleted: your store stays on Pro. What changes is that the **storefront goes completely offline**: every visitor to your subdomain or custom domain sees a "store currently unavailable" page, with no browsing and no buying. Inside the dashboard you can still reach `/dashboard`, `/dashboard/subscribe` (and its payment history), `/dashboard/settings`, `/dashboard/account`, `/dashboard/notifications`, `/dashboard/affiliate`, `/dashboard/ai-credits`, `/dashboard/domains`, invoice downloads and logout; every other page redirects you to the subscribe page. Subscribe to [Pro](https://dzbuild.com/docs/plans/pro.md), [Unlimited](https://dzbuild.com/docs/plans/unlimited.md) or [Enterprise](https://dzbuild.com/docs/plans/enterprise.md) and everything comes straight back, with all your data untouched. **Q: Can I delete a store?** A: Not yourself — there is no delete button in store settings. Deletion is a support action, and it is a **hard delete**: the store, its products, its orders and order items, and every uploaded file are removed permanently. Order history is *not* retained. If you simply want to stop, export your data and stop renewing — an expired store goes offline but keeps all of its data intact. --- Source: https://dzbuild.com/docs/intro.md # Welcome to DZBuild **DZBuild** is the fastest way to start selling online in Algeria. Full Arabic + French support, integrations with every Algerian courier merchants actually use, and Cash-on-Delivery built in from day one. This documentation covers everything from creating your first store to connecting a custom domain and integrating with the developer API. ## 💳 Plans at a glance Every new store starts with **3 free days of Pro** to try the platform, no card needed. The 3 days are fixed and run once per store: they cannot be extended, frozen or restarted. After that, pick a plan to keep going. There are 3 plans you can subscribe to, plus a Free plan that is not for sale: an account that signed up through a DZBuild Free-plan offer link gets its first store on Free instead of the trial, and otherwise it is given only by special request. | Plan | Price (per month) | Orders per month | Products | Landing pages | Pixels | Team | Best for | | -------------- | ----------------- | ---------------- | --------- | ------------- | ---------- | -------------------------------- | ------------------------------------------------------- | | **Pro** | **1,000 DZD** | unlimited | 300 | 3 | 1 per type | 1 | One store running paid ads | | **Unlimited** | **2,500 DZD** | unlimited | unlimited | unlimited | unlimited | 3 | Multilingual storefronts, CRM operations | | **Enterprise** | **5,500 DZD** | unlimited | unlimited | unlimited | unlimited | 25, or unlimited from 15,000 DZD | Large teams that need many staff seats | | Free | Not for sale | **30** | 5 | 0 | 0 | 0 | Through a DZBuild offer link or by special request only | A few things the table can't say in one cell: * **The Free plan's 30-order cap closes the whole storefront.** Once a Free store records its 30th order in a calendar month, every visitor — not just buyers — gets a "store unavailable" page instead of your catalogue, until the next month or until you subscribe. Paid plans have no order cap. * **DZBuild takes no commission on your sales.** You pay the subscription and nothing else; what your buyers pay is yours. * **Landing pages are not sold separately.** They come with the plan: build one by hand in the editor at no extra cost, or generate one with AI credits. There is no per-page purchase. * **Enterprise comes in two sizes.** 5,500 DZD/month includes 25 staff seats; the unlimited-staff size costs 15,000 / 42,000 / 82,500 / 150,000 DZD for 1 / 3 / 6 / 12 months and has no seat limit. You pick the size in the checkout sheet, and the seat limit applies the moment the payment activates, on every payment method (see [Enterprise](https://dzbuild.com/docs/plans/enterprise.md)). * **How many stores you can own is not a plan attribute.** The hard cap is 50 stores per account, but you may only create the next store once **every** store you already own is on an active, unexpired paid plan (Pro, Unlimited or Enterprise). A single expired or Free store blocks creation, and so does a store still on its 3-day trial: a store counts as paid only once a plan payment for it has gone through. There is also a 5-minute cooldown between creations. **Annual saves 2 months on every plan.** Pay 12 months at once and you pay 10,000 instead of 12,000 DZD on Pro, 25,000 instead of 30,000 on Unlimited, and 55,000 instead of 66,000 on Enterprise. ### How subscribing works (in plain words) 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) from your dashboard sidebar. 2. Click the plan you want — **Pro**, **Unlimited** or **Enterprise**. All three are self-serve; there is no sales call and no contact form for Enterprise. 3. Pick how long: **1, 3, 6, or 12 months**. Longer = cheaper per month. 4. Pay one of three ways: * **CIB / Edahabia card (Slick-Pay):** Done in \~30 seconds after the bank's 3-D Secure code. **You don't need any Slick-Pay account or keys** — DZBuild handles the payment side. One-off payment, you renew manually. * **Global card (Visa / Mastercard / PayPal / Apple Pay):** accepted from anywhere in the world, charged in **US dollars** on a secure payment page. The **Auto-renew** box is ticked by default; untick it to pay once. A conversion fee applies, and checkout shows you the exact USD amount before you confirm. * **Manual receipt (BaridiMob):** transfer to the RIP shown on the subscribe page, then upload a screenshot of the receipt. Approval is usually within 30 minutes. 5. The moment your plan is active, all features unlock immediately. > **Need to see how to do it?** Inside [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) there is a **▶ How to renew** button — click it for an in-app walkthrough that highlights every step. Video tutorials are also on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ### How renewing works (read this!) * **Renewal depends on the rail you paid with.** SlickPay (CIB / Edahabia) and manual receipts are one-off payments: nothing is ever charged automatically, you renew by hand. A global card with the **Auto-renew** box ticked (the default) re-charges at the end of each period and adds the new period to your expiry by itself; with the box unticked it is a one-off too. A renewing plan shows a **Card and invoices** link on its subscription card on `/dashboard/subscribe`, which opens the billing portal where you stop the renewal or change the card. * **Expiry reminders** go out once per calendar day for each of the last 7 days before your plan ends, so up to 7 emails, not a fixed 7/3/1 schedule. A plan that renews by itself on a global card gets one email with the renewal date instead. Stores that have never completed a payment (accounts still on the 3-day Pro trial) do not receive these reminders. * **Renewing early stacks the time:** if you have **10 days left** and you renew for **30 more days**, you now have **10 + 30 = 40 days**. No time lost. No gap. * **If you renew after expiry:** the new period starts the day you pay (no stacking, since there was nothing left). * **Switching plans mid-cycle?** Unused time is credited as **time**, never as money — you always pay the new plan's full listed price. Leftover days are converted by price ratio and added to the new expiry. Example: 20 Pro days left and you buy 1 month of Unlimited → 20 × (1,000 ÷ 2,500) = **8 bonus days**, so 1 month + 8 days for the full 2,500 DZD. Downgrading multiplies the days up: 10 Enterprise days become 10 × (5,500 ÷ 1,000) = **55 Pro days**. ### What happens if I do not renew? If your paid plan (Pro, Unlimited, or Enterprise) expires and you do not renew: * **Your storefront goes offline.** Anyone who visits your store, on your `your-slug.dzbuild.app` subdomain *or* your custom domain, sees a **"Store Unavailable"** page. Customers cannot browse or buy until you renew. * **Your dashboard narrows to a few pages.** Until you renew, you can open the dashboard home, the subscribe page and its payment history, settings, your account, notifications, the affiliate page, AI credits and domains. Every other page sends you back to the subscribe page, so you cannot edit products, read orders or save setting changes in the meantime. * **Your custom domain is unlinked.** About 12 hours after expiry, any connected custom domain is disconnected. When you renew, just re-connect it from **Dashboard → Domains** — it takes a minute. * **Nothing is deleted.** Your products, orders, customers, settings, landing pages, Pixels and all configuration are kept exactly as they were — your plan is never downgraded behind the scenes. * **Renew anytime and everything comes back instantly** — your storefront goes live again and all your data is exactly where you left it. (Just re-link your custom domain.) Long inactivity DZBuild reserves the right to close a long-dormant account. This is a policy statement, not an automated process: **an idle store is never closed or deleted automatically** — any such removal is a deliberate decision taken by the DZBuild team. Still, renew — or export your data — if you intend to keep the account. For the full plan-by-plan details and switching rules, jump to [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md). ## 🎬 Platform walkthrough [DZBuild platform walkthrough](https://www.youtube.com/embed/9erR8vHwyS0) ## Quick links * 🚀 [Create your account](https://dzbuild.com/docs/getting-started/create-account.md) (under a minute) * 🏪 [Set up your first store](https://dzbuild.com/docs/getting-started/first-store.md) * 🧭 [Dashboard tour](https://dzbuild.com/docs/getting-started/dashboard-tour.md) * 🤖 [DZBuild Copilot](https://dzbuild.com/docs/copilot/overview.md) — the AI that runs your store: type what you want, it does it * 📦 [Add your first product](https://dzbuild.com/docs/getting-started/first-product.md) * 📥 [Receive your first order](https://dzbuild.com/docs/getting-started/first-order.md) * 🎨 [Themes & customization](https://dzbuild.com/docs/customizing/themes.md) * 🌐 [Connect a custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) * 🧩 [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md) — extend your store * 🔌 [API Reference](https://dzbuild.com/api-docs/intro.md) — for developers integrating with DZBuild ## Why merchants pick DZBuild * **3-day free Pro trial** for every new store, no card needed. When the trial ends, subscribe to **Pro**, **Unlimited** or **Enterprise** to keep your store live. (The Free plan is not for sale: it comes only with a DZBuild Free-plan offer link or by special request.) * **No commission.** DZBuild charges the subscription and takes nothing out of your sales. * **Cash on Delivery (COD)** out of the box, the way Algerian buyers actually pay. A physical-goods storefront is COD only; there is no card checkout for your buyers. Digital-product stores set their buyer payment methods at **Dashboard → Digital → Payment**: CIB / Edahabia card through your own Slick-Pay account, where the buyer pays and receives the product right away, or manual methods (CCP, BaridiMob, Redot Pay or a custom method), where the buyer transfers and uploads a receipt. * **102 integrated couriers**: Yalidine, Yalitec, Guepex, Easy & Speed, Maystro, ZR Express, Abex Express, NOEST Express, Zimou Express, Colivraison, Ecom Delivery, Elogistia, DHD Livraison, Conexlog, MSM Go, WorldExpress and dozens more, including a "custom Ecotrack" tile for any other courier running on the Ecotrack platform. (Ecotrack is the shared API platform many Algerian couriers run on, not a courier you pick.) Which wilayas and communes you can actually deliver to comes from your own account with the courier, not from DZBuild. * **Arabic and French** end to end — storefront, dashboard, emails, receipts. A store's language is either `ar` or `fr`; English exists on this documentation site only. * **7 storefront themes** — Starter and Brico on any plan, Digital on any plan for digital-product stores, "Started V2" (Showcase) on Pro, Prestige and Bloom on Unlimited, Promobi on Enterprise. * **25 first-party add-ons** plus 2 built-in toggles for advanced flows (CRM-style orders, reviews, multi-language storefront, stop-desk picker, webhooks, …). See the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md). * **AI landing-page generator**, **abandoned-cart recovery**, **Pixel + Conversions API** built in. * **Custom domain** support with automatic SSL. ## Where to start If you're brand new, follow the **Getting Started** guides in order: 1. [Create your account](https://dzbuild.com/docs/getting-started/create-account.md) 2. [Set up your first store](https://dzbuild.com/docs/getting-started/first-store.md) 3. [Dashboard tour](https://dzbuild.com/docs/getting-started/dashboard-tour.md) 4. [Add your first product](https://dzbuild.com/docs/getting-started/first-product.md) 5. [Receive your first order](https://dzbuild.com/docs/getting-started/first-order.md) By the end you'll have a live storefront at `{your-slug}.dzbuild.app`, your products listed, and orders flowing. ## What's new * 🚀 The **DZBuild API v1** is live — see the [API Reference](https://dzbuild.com/api-docs/intro.md). * 🧩 Every add-on now has its own page in the [Add-ons catalog](https://dzbuild.com/docs/addons/overview.md). * 🌐 The docs are fully trilingual — switch language in the navbar. ## Getting help * Browse the [blog](https://dzbuild.com/blog) for guides and updates. * Email ****. * Telegram **[@dzbuild](https://t.me/dzbuild)**. * Watch the **[DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off)** for video tutorials — including how to renew your subscription. Inside the dashboard at [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), click the **▶ How to renew** button for an interactive in-app guide. --- Source: https://dzbuild.com/docs/marketing/analytics.md # Analytics DZBuild's dashboard ships with the analytics most merchants need — no setup required. For deeper analysis, you can pipe data into Google Analytics, Looker Studio, or your own warehouse via the public API. ## Where the analytics live Open [`/dashboard`](https://dzbuild.com/dashboard) — the analytics are on the dashboard **home** page, below the date-range buttons. There is no `/dashboard/analytics` page and no Analytics entry in the sidebar unless the Advanced Analytics add-on is active. The default view is the **last 7 days**. After that, the dashboard reopens on the last preset you picked in that browser (a custom range is not remembered). Presets: Today, Yesterday, 7 days, 30 days, This month, Last month, This year, plus a Custom range of up to 365 days. A traffic filter beside the presets narrows the visitor figures to all traffic, landing pages only or the store only; the order figures and the conversion rate always cover the whole store. Every KPI shows a percent-change badge comparing the selected period against the immediately preceding period of the same length. Top-line KPIs: | Metric | Definition | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Revenue** | Merchandise value of **delivered** orders only: subtotal minus discount, excluding shipping and payment fees. An order counts on the day it was *delivered*, not the day it was placed. | | **Profit** | Revenue minus the cost of goods on those delivered orders (quantity × the product's cost price). You must fill the **cost price** on your products — if it's empty, profit equals revenue. | | **Orders** | Every order created in the period, whatever its status (cancelled and returned included). | | **Delivered orders** | Orders delivered inside the period. | | **Cancelled orders** | Orders created in the period with status `cancelled`. | | **AOV** | Average order *total* — shipping and payment fees included — across orders that were not cancelled or returned. | | **Visitors** | Distinct visitor fingerprints that hit the storefront in the period. | | **Page views** | Total storefront page loads. | | **New customers** | Customer records created in the period. | | **Conversion rate** | Orders ÷ Visitors, shown as a percentage (using the all-status order count). | The KPIs don't reconcile with each other — by design Revenue, Orders and AOV are computed from three different order sets and money fields. Revenue is delivered-only and windowed on the *delivery* date; Orders counts every status and is windowed on the *creation* date; AOV averages the full order total across non-cancelled, non-returned orders. So Revenue ÷ Orders will not equal AOV, and AOV × Orders will not equal Revenue. Charts below the KPIs: * **Peak buying hours**: orders and page views for each hour of the day across the selected period, with the busiest sales hour highlighted. * **Visitors & page views**: unique visitors, page views and orders over time. * **Orders by status** * **Top products** — the 10 best-sellers ranked by units sold (cancelled and returned orders excluded), showing quantity, revenue (store owner only) and unique product-page views. Product names are not clickable. * **Top wilayas**: the 10 wilayas with the most orders in the period (all statuses), plotted by order count. All charts respect the date range picker. ### Staff accounts don't see financials If a team member is not the store owner, revenue, profit and AOV are never sent to their account at all: they are not merely hidden in the interface. Staff see orders, visitors, page views and conversion rate; the revenue column disappears from Top products. ## How visitor numbers are collected Visitor and page-view counts come from a JavaScript beacon on the storefront. For each page view it records a browser fingerprint, the page type, the referrer domain, the traffic source, the device and a session ID. Two limits worth knowing: * Visitors with JavaScript disabled, or who leave before the beacon runs, are **not counted**. * Tracking is rate-capped per visitor, so a single very heavy session stops adding page views after a point. ## Advanced Analytics add-on (Enterprise) The **Advanced Analytics** add-on adds a private [Umami](https://umami.is) analytics instance hosted by DZBuild — cookie-free, and no visitor data leaves DZBuild. It is Enterprise-plan only, and is managed at `/dashboard/addons/advanced-analytics`. What it adds over the built-in charts: real-time visitor count, overview and session reports, top pages and referrers, device / browser / OS and country breakdowns, period comparison, UTM breakdowns, custom events, performance metrics — and a **funnel report**, which the built-in dashboard does not have. The add-on page also has a **Full view** button that opens your Umami dashboard in read-only mode: you can browse and filter the reports it shows, but you cannot create or edit reports there. ## Connecting external tools ### Google Analytics 4 Install via [Pixels](https://dzbuild.com/docs/marketing/pixels.md). GA4 receives the same storefront events DZBuild fires for Facebook (`view_item`, `add_to_cart`, `begin_checkout`, `purchase`), plus `generate_lead` when a visitor submits a landing-page custom form. ### Google Tag Manager, Mixpanel, Amplitude DZBuild does **not** push named events to the GTM dataLayer, so a GTM container on its own gives GTM nothing to trigger on. To get e-commerce events into GTM you must **also** add a Google Analytics (or Google Ads) pixel — the storefront then fires `gtag('event', …)` calls that GTM can pick up as Google-Tag events. For Mixpanel or Amplitude, trigger a GTM Custom HTML tag off those Google-Tag events, or off `window.trackPixelEvent`. ### Looker Studio / Power BI / your warehouse Use the [DZBuild API](https://dzbuild.com/api-docs/intro.md) at `https://api.dzbuild.app/v1`: * `GET /v1/orders` — paginate through orders, filter by date. `GET /v1/orders/{id}` for one order. * `GET /v1/analytics?range=30d` returns the dashboard figures: the KPIs with their change against the previous period, plus orders, revenue, visitors, devices, traffic sources, top products and top wilayas. `range` takes the dashboard presets (`today`, `yesterday`, `7d`, `30d`, `this_month`, `last_month`, `this_year`) and defaults to `this_month`; `range=custom&from=YYYY-MM-DD&to=YYYY-MM-DD` covers up to 365 days. Revenue, profit and AOV are left out unless the key belongs to the store owner. Needs the `analytics:read` scope. * `GET /v1/quotas` returns your API key's request limits, handy for guarding a scheduled job. `GET /v1/usage` and `GET /v1/usage/history` count your API calls, not your sales. * `GET /v1/customers`, `GET /v1/products`, `GET /v1/landing-pages` for joins. API keys are Enterprise-only Only the store owner on an active **Enterprise** plan can create keys, at [`/dashboard/api`](https://dzbuild.com/dashboard/api). Other owners see an upgrade card there, and team members see an owner-only notice. You create the key yourself, up to 3 per store, and it authenticates straight away. For near real-time data, subscribe to webhooks. The add-on publishes seven order topics and nothing else: `order.created`, `order.confirmed`, `order.processing`, `order.shipped`, `order.delivered`, `order.cancelled`, `order.returned`. See [Webhooks](https://dzbuild.com/api-docs/webhooks/overview.md). ## Privacy DZBuild does not track customers across sites. Browser-side pixels (when you install them) do, but that's between you and the pixel provider — and DZBuild's CAPI sends only what you configure in [Pixels](https://dzbuild.com/docs/marketing/pixels.md). DZBuild does not generate a privacy policy for you. If you need one, add it as a page or landing page and link it yourself. ## Frequently asked **Q: Why is my visitor count different from Google Analytics?** A: Different collection methods. DZBuild counts distinct browser fingerprints from its own beacon and caps very heavy sessions; GA counts sessions and applies its own bot filtering. **Q: Where do I see returns / cancellations?** A: Filter the orders list at [`/dashboard/orders`](https://dzbuild.com/dashboard/orders) by status, or use the [Advanced Order Management](https://dzbuild.com/docs/addons/advanced-orders.md) add-on. Via the API: `GET /v1/orders?status=returned`. **Q: Can I export the dashboard charts?** A: No. The dashboard charts have no CSV or JSON export today. To get the underlying data out, use the API (`GET /v1/orders`, `GET /v1/analytics`) or the Google Sheets export add-on. **Q: How real-time is the data?** A: The KPI counters and the charts are cached for 120 seconds per store and date range, and reloading inside that window returns the same numbers. While the dashboard home is open, a new order adds itself to the Orders counter and the recent-orders list straight away. --- Source: https://dzbuild.com/docs/marketing/facebook-catalog.md # Facebook Catalog (Meta Commerce) This page covers **how to use** the Facebook Catalog feed. For the add-on's settings screen, see [Add-ons → Facebook Catalog](https://dzbuild.com/docs/addons/facebook-catalog.md). A product catalog in Meta Commerce Manager opens two big channels: * **Dynamic Product Ads (DPA)** — Meta picks the right product to show each shopper, automatically retargeting cart-abandoners and showing predicted matches to cold traffic. * **Instagram Shopping** — products become taggable in Instagram posts, Reels, and Stories. DZBuild auto-generates the XML feed Meta needs. You paste the feed URL into Commerce Manager and Meta does the rest. ## Step 1 — get the feed URL The Facebook Catalog feed is enabled for **every** store automatically — there is nothing to activate. 1. Open [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) → the **Facebook Catalog** card → **Manage catalog** (or go straight to `/dashboard/addons/facebook-catalog`). 2. Copy the **feed URL** shown at the top. The URL follows one of two patterns: * When your custom domain is working and set as your store's primary address on the Domains page: `https://your-domain.com/feed/facebook.xml` * Otherwise: `https://your-store-slug.dzbuild.app/feed/facebook.xml` Connecting a custom domain changes the feed URL Once your custom domain is working and set as your store's primary address, the feed moves to that domain. While **Send visitors of the other address to the primary address** stays on (the default), the old feed URL redirects to the new one, but update the data-feed source in Commerce Manager anyway so Meta fetches the new URL directly. ## Step 2 — create the catalog in Meta Commerce Manager 1. Open [Meta Commerce Manager](https://business.facebook.com/commerce). 2. **Add catalog** → category: **E-commerce**. 3. **Upload product info** → **Use a data feed**. 4. Paste your DZBuild feed URL. 5. Pick a fetch frequency. Meta owns that schedule and DZBuild never sees it, so treat whatever the options are as Meta's business. Fetching more often than hourly gains nothing: the feed file itself is rebuilt at most once an hour. 6. Connect the catalog to your Facebook Page + Pixel + Ad Account. Meta then fetches the feed and validates it before the catalog goes live. How long that takes is on Meta's side; the Commerce Manager data-source screen shows the status of each fetch. ## Step 3 — Instagram Shopping 1. In Commerce Manager, link your Instagram Business account. 2. Submit the account for review (Instagram approves shopping accounts; can take days). 3. Once approved, you can tag products in Instagram posts, Reels, and Stories. The tag links back to your DZBuild storefront product page. DZBuild's part ends at the feed. Which accounts get approved, and which products can be tagged, are Meta's rules, and Meta's help centre is the place to take a rejection. ## Step 4 — Dynamic Product Ads Once the catalog is live and your [Pixel](https://dzbuild.com/docs/marketing/pixels.md) (with CAPI) is firing `ViewContent`, `AddToCart`, and `Purchase`: 1. In Meta Ads Manager, create a campaign with objective **Sales**. 2. Ad set → audience: **Retargeting** = "viewed product but didn't purchase" (Meta builds this from Pixel data). 3. Ad → creative → **Catalog** → select your DZBuild catalog. 4. Meta dynamically fills the ad with the right product per viewer. Catalog-to-pixel matching works out of the box Catalog item IDs are the numeric DZBuild product IDs, and the pixel sends those same IDs in `content_ids` — so matching needs no configuration. Do **not** override `content_ids` with SKUs or custom IDs, or Catalog Diagnostics will report a 0% match. (The feed links to `/product/` while the canonical product URL uses the slug; both resolve to the same page.) ## What the feed contains One `` per **product**. Fields emitted: | Feed field | Source | | -------------------------- | -------------------------------------------------------------------------------------------------- | | `g:id` | Numeric DZBuild product ID | | `g:title` | Product name | | `g:description` | Short description → otherwise the full description with HTML stripped → otherwise the product name | | `g:link` | Product page URL | | `g:image_link` | Primary product image | | `g:additional_image_link` | Up to 10 more images from the product gallery | | `g:availability` | `in stock` / `out of stock` | | `g:price` / `g:sale_price` | See the sale-price note below | | `g:condition` | From add-on settings (new / refurbished / used) | | `g:brand` | From add-on settings; defaults to your store name | | `g:product_type` | The product's primary category name | | `g:mpn` | The product's SKU | Two things are **not** emitted: `g:google_product_category` (some Commerce Manager checks flag its absence as a warning) and `g:item_group_id`. **Sale price behaviour:** when a product has a compare-at price higher than its selling price, the feed puts the **compare price** in `g:price` and the real selling price in `g:sale_price` — so Meta advertises it as a discount with the compare price struck through. ## Variant handling The feed is one item per **product**, not per variant. Variants (size, colour, …) are not split into separate catalog items and `item_group_id` is not emitted, so Dynamic Product Ads always show the product's primary image and price — never a specific variant combination. Practical consequence: make sure the product's **primary** image and price represent the product well on their own, because that is what every DPA impression will show. ## Add-on settings At `/dashboard/addons/facebook-catalog` you can set: * **Brand** — free text. Leave it blank and the feed uses your store name. * **Condition** — a fixed dropdown: new, refurbished or used. Not free text. * **Currency** — must be a valid 3-letter ISO code. The form rejects anything else, and if a bad value ever gets through, the feed falls back to `DZD`. The page also shows how many active products, images and categories will go into the feed. Note that this product count still includes hidden products, so it can read slightly higher than the number of items actually in the feed. ## Strategies that work in Algeria (COD) * **Cart-abandoner retargeting** — show the exact product the customer viewed, with a soft reminder copy. Works on customers who left during checkout. Pair with [Abandoned cart recovery](https://dzbuild.com/docs/advanced/abandoned-cart-strategy.md). * **3-day product retargeting** — show products viewed in the last 3 days but not purchased. Cap frequency at 5/week — Algerian buyers are sensitive to ad fatigue. * **Cross-sell** — once a customer buys product A, retarget them with related products in the same category for the next 14 days. * **Cold prospecting** — feed the catalog into Advantage+ Catalog Ads. Meta's algorithm picks which product to test on which audience. Best for stores with 30+ SKUs. ## Frequently asked **Q: Why are products missing from my catalog?** A: Draft/archived products and products marked hidden are excluded. Out-of-stock products **are** included, tagged `availability: out of stock` — Meta keeps them in the catalog but won't serve them in ads. Products with no image are also included, but they fail Meta's validation, so add at least one image. **Q: How fast does Meta see my updates?** A: Meta re-fetches on the schedule you set in Commerce Manager. On top of that, the feed itself regenerates at most once an **hour**, so a product edit can take up to an hour to reach it. To publish a change immediately, open `/dashboard/addons/facebook-catalog`, click **Refresh cache**, then trigger the fetch in Commerce Manager. Saving the add-on settings also refreshes the feed. **Q: Can I edit fields in the feed?** A: The add-on settings let you set Brand, Condition, and Currency. Other fields come from your products — edit the product to change them. **Q: Is there a separate feed per language?** A: No. There is exactly one feed per store, in whatever language you entered the product names and descriptions. Adding `?lang=ar` or `?lang=fr` to the feed URL does nothing — you get the same feed back. **Q: Does the catalog count toward my plan limits?** A: No — the feed is generated from your existing products. There's no extra count or fee. **Q: What happens to the feed if my subscription expires?** A: The storefront itself is blocked once your subscription expires, so anyone clicking a catalog ad lands on a page where they cannot buy. Don't count on the feed stopping on its own — pause your catalog ads before letting a subscription lapse. --- Source: https://dzbuild.com/docs/marketing/pixels.md # Pixels & tracking Pixels are tiny scripts that fire events when customers interact with your store. They power retargeting ads, conversion tracking, and attribution — install them before running paid traffic. ## What we support | Tracker | Coverage | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | **Facebook Pixel (Meta)** | Browser-side events + Conversions API (server-side) | | **TikTok Pixel** | Browser-side events + Events API (server-side) | | **Snapchat Pixel** | Browser-side events + Conversions API (server-side) | | **Pinterest Tag** | Browser-side events + Conversions API (server-side). Needs the Pinterest **ad account ID** as well as the token. | | **Google Analytics** | Browser-side only | | **Google Tag Manager** | Browser-side only | | **Google Ads** | Browser-side only. Needs a **conversion label** in addition to the `AW-` ID, otherwise the tag can only build remarketing audiences. | All pixel configuration lives on one page — [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels). (`/dashboard/pixels/multi` is an alias for the same screen, and there is a single **Pixels** entry in the sidebar.) There is no separate "single-pixel mode": you add pixels one at a time, and on paid plans you can add several. ## Plan limits Pixel availability scales with your subscription plan: | Plan | Pixels per type | Notes | | -------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | **Free** | 0 | Pixel management is locked. Upgrade to track ads. | | **Pro** | **1 of each type**, 7 total | One Facebook, one TikTok, one Snapchat, one Pinterest, one Google Analytics, one Google Tag Manager and one Google Ads pixel. | | **Unlimited** | **unlimited per type** | Add as many Facebook / TikTok / etc. instances as you need. | | **Enterprise** | unlimited per type | Same as Unlimited. | An expired plan does not move your store down to Free. The storefront goes offline instead, so there are no page views left to track and no events fire. Your pixel configuration is untouched and starts working again the moment you renew. Renewal: open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and click the **▶ How to renew** button for the in-app guided tour, or watch the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Standard events fired The storefront fires these canonical events when a customer interacts. Not every event maps to every pixel — the exceptions are noted in the table and below it: | Event | When | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PageView` | Every page load | | `ViewContent` | Product page view, or a landing-page view | | `AddToCart` | The customer adds a product to the cart — product page, variant modal, quick-add | | `InitiateCheckout` | The customer reaches `/checkout`, **or** submits the one-step fast-checkout form on a product page, **or** submits an order form on a landing page (these buyers never load `/checkout`, so this is their only IC signal). Simply *opening* the fast-checkout form fires nothing. | | `Purchase` | Order successfully placed | | `Search` | Not sent. Searching your store fires no pixel event, so no platform receives `Search`. | | `Lead` | The customer submits a landing-page **custom form** section | | `Delivered` | Server-only Meta custom event, fired after an order is marked delivered | Per-pixel mappings: Facebook uses these names directly; TikTok, Snapchat and Pinterest have equivalents auto-mapped; Google Analytics uses `view_item`, `add_to_cart`, `begin_checkout`, `purchase`. Two events behave differently from the rest: * **`Lead`** has no Pinterest equivalent and maps to `Lead` (Meta), `SubmitForm` (TikTok), `SIGN_UP` (Snapchat), `generate_lead` (Google Analytics). For Meta it is sent from the browser and, when the pixel has an access token, through the Conversions API with a shared event ID, so Meta counts it once; the other platforms get the browser event only. Custom-form submissions do **not** fire `Purchase`. * **`Delivered`** is server-only (no browser twin) and fires roughly 30 minutes after you mark an order delivered. It is a Meta *custom* event: Custom Audiences can use it directly, but to optimise a campaign toward it you must first create a **Custom Conversion** in Events Manager. ## Adding a pixel 1. Get the pixel / measurement / tag ID from the ad platform. 2. Open [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels) and click **Add pixel**. 3. Choose the platform — Facebook, TikTok, Snapchat, Pinterest, Google Analytics, Google Tag Manager or Google Ads. 4. Enter a name and the ID, then fill the platform-specific extras: * **Conversions API access token** — Facebook, TikTok, Snapchat, Pinterest. * **Ad account ID** — Pinterest only. Without it you get no server-side events and no error message. * **Conversion label** — Google Ads only. Without it the tag builds remarketing audiences but records no purchase conversions. * **Domain verification code** — Facebook only, optional. Paste the value from your [Meta owned-domains](https://business.facebook.com) settings and DZBuild renders it as a meta tag on your storefront. 5. Save. Events fire immediately on the storefront. Repeat to add more pixels (paid plans only). A Google Tag Manager container on its own receives no events DZBuild does not push named events to the GTM dataLayer. To give GTM something to trigger on, add a **Google Analytics** (or Google Ads) pixel as well — the storefront then fires `gtag('event', …)` calls that GTM can pick up as Google-Tag events. Each pixel card has an **on/off switch**. Turning a pixel off keeps its configuration and its targeting assignments but stops both browser and server-side events — useful for pausing an ad account without losing setup. ## Targeting a pixel to specific products, categories or landing pages Targeting is configured **per pixel**, not per landing page. Click the link (chain) icon on a pixel card and pick any combination of products, categories and landing pages. The pixel card then shows badges for what it is assigned to. * A pixel with **no assignments** is global: it initialises and receives events on every storefront page, including landing pages. * A pixel **with assignments** only initialises — and only receives events — on matching pages. * Assignments *narrow one pixel*; they never suppress your other pixels. A landing page still receives every global store pixel in addition to the pixel you assigned to it. Two traps worth knowing: * An order containing products from two different targeted pixels books the **full order value into both** datasets. Splitting one store across two ad accounts is never perfectly clean. * If every product assigned to a pixel is deleted, that pixel has zero assignments again — and silently becomes global. ## Running two Facebook pixels on one store Events fire to every pixel that is active on the current page. For Facebook specifically, the Meta SDK broadcasts each event to **every initialised Facebook pixel** on the page, so two global Facebook pixels each record the other's events. If you run two ad accounts against one store, assign each Facebook pixel to a distinct set of products — and remember the caveat above about mixed orders. ## Conversions API (CAPI) CAPI is server-side event sending. The browser-side pixel fires from the customer's device; CAPI fires the same event from DZBuild's servers. This is available for Facebook, TikTok, Snapchat and Pinterest, and bypasses: * iOS 14+ tracking restrictions (ATT) * Brave / Firefox tracking protection * ad blockers (uBlock, Adblock Plus, etc.) * network filters (some Algerian ISPs) DZBuild auto-hashes the customer's email and phone (per Meta's spec) before sending CAPI events. Both browser and server events share an `event_id` so the platform deduplicates and counts each conversion once. Turning CAPI on raises the event-match quality Meta reports, because the server sends hashed identifiers the browser event does not always carry. DZBuild publishes no benchmark score: the number you see depends on which fields your checkout collects, and a COD checkout that asks only for a name, a phone and an address has less to match on than one that also collects an email. Pinterest note: `InitiateCheckout` is deliberately **not** mapped for Pinterest, because Pinterest's own `checkout` event means a completed purchase — sending it at checkout start would double-count sales. ## Verifying it works * **Facebook Pixel Helper** browser extension — visit your storefront and watch `PageView` and `ViewContent` fire. * **Meta Events Manager → Test events**: place a real test order; events appear within seconds. To see the server events there too, copy the test code from Test events, open your Facebook pixel with **Edit** on `/dashboard/pixels`, paste it into the **Test events code** field and save; DZBuild uses it for one hour, then ignores it. CAPI events show up tagged `Server`. * **TikTok Events Manager → Test events** — same flow. * **GA4 → DebugView** — same flow. ### When the helper says "no pixel detected" This is the most common pixel question, and it is almost never a broken pixel. Work through the three causes in order. **1. The pixel has not loaded yet.** Every DZBuild store defers its pixel SDKs (on product pages, Snapchat and Pinterest load straight away): the loader waits for the browser to go idle, for the visitor's first interaction (scroll, tap, key press), or for the visitor to switch away from the tab. On a fresh page load with no interaction, a helper extension sees nothing for the first second or two. Scroll or tap the page and the pixel appears. No events are lost, they queue while the SDK loads. The order-confirmation page is the exception and loads its pixels immediately, because `Purchase` fires there. **2. An ad blocker is running in your own browser.** A blocker, or a browser with tracking protection turned up, stops the pixel script from loading at all, so the helper reports nothing no matter how long you wait. Open the store in a different browser (a clean Chrome profile is the easiest test) with no blocker installed, then check again. **3. You are looking in the wrong place for server-side events.** If Pixel and the Conversions API are both configured, DZBuild keeps sending events from its servers even for buyers who block the browser pixel. Those events never appear in a browser helper. Look at Meta Events Manager, Test events, where they arrive tagged `Server`. ## Best practices * **Always** install a Pixel before running paid ads. Without it, the algorithm has nothing to optimize toward. * **Add CAPI** the moment you turn on Facebook ads — the match-quality lift compounds over weeks. * **Single source of truth** — pick the pixels you'll actively use. Don't run 5 pixels just in case. * **Don't fire fake events** — inflating events hurts ad delivery quality long-term. * **Match your ad account to the right Pixel** when you run several — wrong-pixel attribution wastes spend. ## Frequently asked **Q: My Pixel fires but Meta says "low event-match quality."** A: Add the Conversions API. Sending the hashed email and phone from the server gives Meta more fields to match on than the browser event alone. **Q: Can I use both browser-side and CAPI for the same Pixel?** A: Yes — Meta deduplicates by `event_id`. We send both with matching IDs. **Q: Where do I install Hotjar / Clarity / a custom script?** A: The pixel manager at `/dashboard/pixels` handles pixels only, and no dashboard screen takes custom head or body HTML. On the **Enterprise** plan, [`/dashboard/customize`](https://dzbuild.com/dashboard/customize) has a **Custom JavaScript** panel: paste the tool's JavaScript without the `script` tag (up to 50,000 bytes) and save. It runs on your storefront pages after they load, but not on landing pages or in the preview, so open your store to test it. See the [Custom JavaScript guide](https://dzbuild.com/docs/storefront/custom-js-guide.md). On other plans, contact support if you need a third-party snippet on your storefront. **Q: Will pixels slow my store?** A: No. Pixel SDKs load asynchronously, and apart from Snapchat and Pinterest on product pages they also wait until the browser is idle or the visitor interacts, so they stay off the critical rendering path. --- Source: https://dzbuild.com/docs/marketing/seo.md # SEO DZBuild ships with most SEO basics already taken care of — sitemaps, structured data, mobile-first themes, fast loads. Your job is to write product names and descriptions that Google can rank, and to fill in the few store-level fields DZBuild exposes. ## What DZBuild does automatically * **Sitemap.xml**: auto-generated per store. Updates as you create/edit products and categories, and includes a Google **image sitemap** (up to 5 images per product), so your product photos are submitted to Google Images automatically. The file itself is built fresh on every request, so a new product is in it as soon as you save. What can lag is the copy the CDN serves: that one is held for up to 24 hours, so allow a day before you conclude a product is missing. * **Robots.txt**: generated per store. Everything is crawlable except the transactional paths (`/checkout`, `/cart`, `/order-success/`, `/api/`), and it points crawlers at your store's sitemap. On the address that is not your store's primary address, `robots.txt` redirects to the primary address, or serves `Disallow: /` if you switched that redirect off, so Google consolidates on one property. * **Structured data** (`schema.org`) — product pages emit `Product` + `Offer` (with `MerchantReturnPolicy` and `OfferShippingDetails`) and a `BreadcrumbList`. The store home page emits a `Store` node (name, logo, phone, email, address, social profiles) with a site-search action, plus an `ItemList` of your products. Category pages emit `CollectionPage` (with the store as `isPartOf`), a `BreadcrumbList` and an `ItemList`. * **Canonical URLs** — every product/category has a `` so duplicate URLs don't dilute ranking. * **Open Graph + Twitter cards** — pretty link previews when customers share product URLs in WhatsApp / Facebook / Telegram. * **hreflang**: every storefront page carries a self-referencing `hreflang` (`ar-DZ` or `fr-DZ`) plus `x-default`, with no add-on needed. With the [Multi-Language](https://dzbuild.com/docs/addons/multi-language.md) add-on active, your store uses language-prefixed URLs and each page instead lists one alternate per language: the default language at the bare path and the others under `/ar/` or `/fr/`, plus `x-default`. * **Crawl directives** — storefronts opt out of Google's automatic translation (`notranslate`) and opt in to large image previews and unlimited snippet length (`max-image-preview:large`, `max-snippet:-1`). * **HTTPS** — every store has SSL by default, with no setup on your side. * **Mobile-first responsive themes** — every DZBuild theme is mobile-first and responsive. * **Fast page loads** — assets are served from a global CDN, and product images are automatically resized and delivered in WebP. An expired plan de-indexes your store If your subscription lapses — or a free-plan store hits its order limit — the sitemap goes empty and is served with `X-Robots-Tag: noindex, nofollow`. Google will drop the store from its index. Rankings you spent months building do not come back instantly when you re-subscribe. ### AI answer engines DZBuild storefronts explicitly allow the major AI crawlers, so your products can be cited and linked in AI answers rather than being invisible to them. The allowlist covers OpenAI (GPTBot, ChatGPT-User, OAI-SearchBot), Anthropic (ClaudeBot, Claude-Web, Claude-SearchBot, anthropic-ai), Perplexity (PerplexityBot, Perplexity-User), Google-Extended, Applebot-Extended, meta-externalagent, Amazonbot, Bytespider, CCBot, YouBot, DuckAssistBot, cohere-ai, MistralAI-User, Diffbot, Timpibot and omgili — 22 bots in all. ## What you control ### Products and categories Products and categories have **no** SEO fields — no editable slug, no meta title, no meta description. DZBuild generates all of them: * **Page title** — `Product name - Store name`. * **Meta description** — the first 160 characters of the product description, with HTML stripped. If the description is empty it falls back to `Product name - Store name - Price DZD`. * **URL slug** — generated from the product name. For products it is regenerated every time you save the product; for categories, only when the name changes. * **Open Graph image** — the product's primary image. So the two levers that actually move product SEO are: a strong, keyword-bearing product **name**, and keywords placed in the **first \~160 characters** of the description. Landing pages are the exception — `/dashboard/landing-pages` → edit a page gives you real SEO title and description fields. ### Store-level SEO Two different screens: **[`/dashboard/settings`](https://dzbuild.com/dashboard/settings) → SEO section** * Google Search Console verification code * Bing Webmaster verification code Paste only the `content="…"` value from the verification tag, not the whole `` tag. The page shows an example with the right part highlighted. **[`/dashboard/customize`](https://dzbuild.com/dashboard/customize) → SEO panel** * SEO title * SEO description * SEO keywords (rendered as a `keywords` meta tag — Google ignores it, but some other engines still read it) There is **no** "default OG image" setting. Pages without their own image fall back to your store logo, so upload a logo that still reads well at 1200×630. ### Google Search Console 1. Add your domain to [Google Search Console](https://search.google.com/search-console). 2. Verify via the meta tag method — paste only the `content="…"` value into the verification field in [`/dashboard/settings`](https://dzbuild.com/dashboard/settings). 3. Submit `https://your-domain.com/sitemap.xml` so Google indexes faster. Verify your store's primary address Your store has one primary address, set on the Domains page. Once your custom domain is working it becomes the primary address by default, and the `.dzbuild.app` subdomain then sends `robots.txt` and `sitemap.xml` to it with a 301 redirect (its `robots.txt` serves `Disallow: /` instead if you switch that redirect off). Add and verify the address marked **Primary address** as the property in Search Console. A property on the other address will only ever report an empty, de-indexed site. ## Targeting Algerian search | Tactic | Why | | ------------------------------------------------- | -------------------------------------------------- | | **Arabic keywords** in titles + descriptions | Largest share of Algerian search volume | | **Wilaya names** in product/category descriptions | Captures *"X في الجزائر"* / *"X à Alger"* searches | | **"التوصيل"** or **"livraison"** | Strong purchase-intent signal | | **Prices in DZD** | Captures price-sensitive queries (DA / دج) | ## Content that ranks * Write product descriptions like a person, not a spec sheet — and front-load the keywords, because the first 160 characters become your meta description. * Use **bullet lists** for benefits — Google likes them and so do scanners. * Add **FAQs** to category and landing pages — they often surface as featured snippets. * Internal-link related products / categories. * Long-form blog content on category topics adds long-tail traffic over months. ## Speed Speed is a ranking factor and a conversion factor. DZBuild storefronts are built mobile-first with CDN-served assets, automatic WebP images, lazy-loaded below-fold content and deferred tracking scripts. Run [PageSpeed Insights](https://pagespeed.web.dev) on your own store — heavy product images and merchant-added scripts are the usual causes of a low score. ## Frequently asked **Q: How long until I rank?** A: Nobody can give you a date, and DZBuild will not invent one. It depends on the keyword, who else is already ranking for it, and how much content you publish. Run paid traffic in parallel so the store earns while the organic side builds up. **Q: Do I need Google Analytics?** A: Optional but useful. See [Pixels](https://dzbuild.com/docs/marketing/pixels.md) — or use the built-in [analytics](https://dzbuild.com/docs/marketing/analytics.md) on the dashboard home page at [`/dashboard`](https://dzbuild.com/dashboard). **Q: Will the Product Reviews add-on give me star ratings in Google results?** A: No. The [Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md) add-on displays star ratings on the product page, but it does not add `AggregateRating` to the page's structured data, so Google will not show review stars in search results. **Q: What about Yandex / Bing / Baidu?** A: Google carries the overwhelming majority of Algerian search traffic, with Bing a distant second. Yandex and Baidu are not worth optimizing for unless you sell B2B internationally. --- Source: https://dzbuild.com/docs/operations/account-and-password.md # Account and password Your DZBuild account is separate from your store. You sign in with an **email address and a password**, and the same account can own several stores. Everything below is on one page: [`/dashboard/account`](https://dzbuild.com/dashboard/account). ## What is on the account page | Card | What you can do | | ----------------------------- | ---------------------------------------------------------------------------------- | | **Account information** | See and change your email and phone number; see your registration date (read-only) | | **Change name** | Update your first and last name, once per week | | **Change password** | Replace your password after confirming the current one | | **Two-factor authentication** | Turn on a code from an authenticator app, and manage backup codes | | **Connected devices** | See the devices signed in to your account and end any session | | **Quick links** | Store settings, notification settings, sign out | Your store name, logo and storefront settings are not here; they live in [`/dashboard/settings`](https://dzbuild.com/dashboard/settings). ## If you signed up with Google or Facebook When you create an account with the **Google** or **Facebook** button, DZBuild generates a password for you and emails it to the same address, in a welcome message sent the moment the account is created. That password is what the page means by *current password*. If you cannot find it, search your mailbox for `dzbuild` and check the spam folder. If it is nowhere, use **Forgot password** on the login page and set a new one; you can keep using the Google or Facebook button afterwards. ## Changing your password On [`/dashboard/account`](https://dzbuild.com/dashboard/account), fill the **Change password** card: current password, new password, confirmation. The new password must be at least 8 characters, and the two fields have to match. When it is saved, DZBuild signs out **every other device** on your account and keeps the browser you are working in. You also get an email confirming the change, with the time and the IP address it came from. If that email arrives and it was not you, reset the password immediately and end the sessions you do not recognise. ## Resetting a forgotten password Use **Forgot password** on the login page, enter your account email, and pass the anti-bot check. If the address belongs to an active account, a reset link is sent to it; the page shows the same message either way, so it never reveals whether an address is registered. The link has three rules that explain almost every "this link is invalid" error: * it is valid for **1 hour** * it works **once**, and stops working after the password is changed * asking for a new link **cancels the previous one**, so always click the newest email Finishing a reset signs out every session on the account, including devices you had marked as trusted for two-factor authentication. Sign in again on each device afterwards. If you no longer have access to the account email, contact support before changing anything else. ## Changing your email or phone number Both changes start the same way: click **Edit** on the row, type the new value, and enter your **current password**. DZBuild then sends a confirmation link, valid for **60 minutes**, and the change only applies when you open it. While it is pending, the row shows a waiting notice with the new value. Where the link is sent differs, on purpose: * **Email change** goes to the **new address**, so you prove the mailbox is yours. Because the email is your login identifier, confirming it signs out every other device; the browser that opened the link stays in, and you sign in with the new address from then on. * **Phone change** goes to the **email already on the account**, so the account owner approves it. The number is accepted as 8 to 15 digits, with an optional leading `+`. You can start at most **3 of these requests every 10 minutes**. If the new email already belongs to another DZBuild account, the link fails at the moment you open it and nothing changes. ## Changing your name The **Change name** card updates the first and last name shown in the dashboard and on invoices. It is limited to **one change per week**; until the week is up, the card shows how many days are left instead of the form. ## Two-factor authentication Two-factor authentication (2FA) is available on **every plan**, and each person turns it on for their own account. A store owner cannot enable it for a team member or require it. 1. Open the **Two-factor authentication** card and click **Enable 2FA**. 2. Scan the QR code with an authenticator app such as Google Authenticator or Authy, or type the manual key. 3. Enter the 6-digit code the app shows to confirm. 4. Save the **8 backup codes**. They are displayed once, each one works a single time, and they are your way back in if you lose the phone. At the next sign-in the login page asks for the code, with a **Trust this device** checkbox that skips the code on that browser for **30 days**. You can switch the field to a backup code from the same page. Backup codes can be regenerated at any time from the account page with **Regenerate backup codes**, which asks for your password and a code and replaces the old set. Turning 2FA off asks for your password and a valid code. If you lose the authenticator app and all your backup codes, contact support with proof of identity; there is no self-service way around it. ## Devices signed in to your account The **Connected devices** card lists the sessions currently signed in, with the one you are using marked as this device. **End session** cuts one of them off immediately, and **Sign out all other devices** clears everything except the browser you are in. Use it after signing in on a shared computer, or the moment something looks wrong. ## Deleting a store or your account Neither deletion is self-service, and support handles both: * **One store, keeping the others** on the same account: ask support. It is the same request described in [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). * **The whole account**: ask support and attach a screenshot of your account settings page showing the email address, and the phone number if you have one, linked to the account. The team confirms the request with you in the ticket, and the account is fully deleted after **30 days**. Export anything you want to keep before you ask, including order and customer data. ## Frequently asked **Q: Can I sign in with my phone number instead of my email?** A: No. The email address on your account is the login identifier; the phone number is contact information only. **Q: I signed up with Google and I never chose a password. What do I enter?** A: The one that was emailed to you when the account was created. Search your mailbox for `dzbuild`, spam folder included, or reset it with **Forgot password**. **Q: Why was I signed out everywhere after changing my email?** A: Because the email is what you sign in with. Changing it invalidates the other sessions on purpose; sign in again with the new address. **Q: Does DZBuild send a code by SMS?** A: No. Two-factor codes come from an authenticator app on your phone, and every confirmation link is sent by email. **Q: Can two people share one account?** A: Do not. Invite them instead with their own account and scoped permissions; see [Team and permissions](https://dzbuild.com/docs/operations/team.md). --- Source: https://dzbuild.com/docs/operations/affiliate.md # Affiliate program DZBuild's affiliate program pays you a commission each time a merchant you referred pays for a subscription. Available to all accounts at `/dashboard/affiliate`. Two different programs This page covers the in-dashboard **merchant referral** program. Marketers and influencers who are not DZBuild merchants apply to a separate program at [affiliate.dzbuild.com](https://affiliate.dzbuild.com), which has its own rates, dashboard and payout flow. ## Joining There is nothing to apply for. Simply opening [`/dashboard/affiliate`](https://dzbuild.com/dashboard/affiliate) enrols you and mints your referral code — on any plan, including Free. ## How it works 1. Open `/dashboard/affiliate` — your unique referral link (`dzbuild.com/register?ref=YOURCODE`) is shown there. 2. Share it with people who don't yet have a DZBuild account. 3. Attribution is captured when the visitor reaches the registration page carrying your code, either in the URL or from the 7-day cookie set if they came in through a `dzbuild.com/r/YOURCODE` short link. The cookie keeps the first short link clicked, but a code in the registration link itself always takes priority. The visitor has to create the account with the email registration form: an account opened with the Google or Facebook button is not linked to you. Once written to their account, the attribution never changes. 4. Commission is credited when they pay: by CIB/EDAHABIA card, by global card, or once their BaridiMob receipt is approved. You cannot earn on your own account. ## What the page shows * Your **balance** — total earnings minus what has already been paid out. * Your **referral link**. * The list of **people who signed up through you**, with how many payments each has made and how much commission they generated. * Your **commission history** and your **payout history**. ## Commission rates | Payment number from the referred merchant | Your commission | | ----------------------------------------- | --------------- | | 1st payment | **30%** | | 2nd payment | **20%** | | 3rd payment | **10%** | | 4th and beyond | **5%** | The ladder is counted **per referred merchant**, not across your whole account: every new merchant you bring starts again at 30%. Commissions apply to plan payments, not to add-on purchases. ## Minimum payout You must accumulate at least **5,000 DZD** before requesting a payout. ## Requesting a payout 1. Go to `/dashboard/affiliate`. 2. Set a payout method first — **CCP, BaridiMob, Wise, Paysera or RedotPay** — together with your account details (max 255 characters). The request is refused until one is saved. 3. Once your balance reaches 5,000 DZD, click the request-payout button. Rules to know: * A request always withdraws your **entire** available balance — partial amounts are not possible. * Only one payout can be pending or processing at a time. * You can submit at most one request per hour. Payouts are processed manually by the team — there is no fixed processing time. --- Source: https://dzbuild.com/docs/operations/domains.md # Domain management This page covers ongoing domain operations — what the Domains page actually shows, buying a domain through DZBuild, and removing one. For the end-to-end first-time DNS walkthrough (CNAME records, Cloudflare verification), see [Custom domain](https://dzbuild.com/docs/customizing/custom-domain.md). ## Where this lives Open [`/dashboard/domains`](https://dzbuild.com/dashboard/domains). The page has three tabs — **Connect domain**, **Buy domain** and **Order history**. Above the tabs, the **Your store's addresses** card lists your free address (`{store-slug}.dzbuild.app`) and, once you link one, your custom domain (a store can have exactly one) with its status: **Waiting for DNS**, **Activating certificate**, **Final check**, then **Working** once it is live. The primary address carries a **Primary address** star, and the custom domain has a **Remove** button that asks you to confirm. Once the custom domain is working, the **Your store's primary address** card appears. Pick which address is primary and whether **Send visitors of the other address to the primary address** stays on, then click **Save**. Domains you bought through DZBuild appear in the **Your purchased domains** card with the expiry date, the renewal price and a **Renew for 1 year** button; a warning shows when a domain expires within 30 days or has expired. On the Free plan the whole Connect tab is replaced by an upgrade prompt. There is no last-DNS-check timestamp. ## One custom domain per store A store can have exactly **one** custom domain. Linking requires a paid plan — Pro, Unlimited and Enterprise all allow exactly one; on Free the Connect tab is replaced by an upgrade prompt. Upgrading from Pro to Unlimited does not raise the count. If you need a second brand on its own domain, create a second store — see [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). To move off Free, upgrade from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). The **▶ How to renew** button on that page launches a guided in-app tour; video walkthroughs are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Default subdomain Every store gets a default subdomain at `{store-slug}.dzbuild.app` (or `{store-slug}.minacef.app` for the Minacef tenant). There is no field for changing the slug yourself. If you rebrand, either attach a custom domain, or open a support ticket with your account email, the current store link and the link you want; the team can move you to the new slug. Your store keeps working on `{store-slug}.dzbuild.app` while a custom domain is being set up. Once the custom domain passes all its checks and shows **Working**, it becomes the primary address and `{store-slug}.dzbuild.app` 301-redirects visitors to it (the dashboard's theme-preview iframe, which uses `?preview=1`, is not redirected). You can change that at any time in the **Your store's primary address** card: make the free address primary, or turn off **Send visitors of the other address to the primary address** so both addresses serve the storefront. If your custom domain's DNS or SSL breaks later, make the free address primary or remove the custom domain at [`/dashboard/domains`](https://dzbuild.com/dashboard/domains). ## Adding a custom domain 1. At your DNS registrar, point your domain to DZBuild via a CNAME record: | Record | Host | Target | | ------ | ---------- | ------------------ | | CNAME | `@` (apex) | `link.dzbuild.app` | If your registrar refuses a CNAME on the apex, point the **`www`** host at `link.dzbuild.app` instead — verification accepts that too (see below). 2. In DZBuild, open [`/dashboard/domains`](https://dzbuild.com/dashboard/domains) → **Connect domain**, type your domain and click **Verify & link**. 3. Wait for the checks. The page shows the progress (**DNS settings**, **Security certificate (SSL)**, **Final check**) and your store stays online on `{store-slug}.dzbuild.app` meanwhile; this usually takes 10 minutes to 2 hours. If the certificate takes longer than usual, the page shows a TXT record to add at your registrar. If your registrar doesn't allow apex CNAMEs (e.g. Hostinger), see the [Custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) page for the Cloudflare-nameservers path. ### The `www` alternative If your registrar refuses a CNAME on the root, add a CNAME on the **`www`** host pointing to `link.dzbuild.app` — verification checks `www` in addition to the apex, so it passes either way. DZBuild stores the apex form of the domain and your storefront answers on both hostnames. ## Redirects DZBuild applies Once your custom domain is working, the **Your store's primary address** card decides the redirects: * Custom domain primary with the redirect on (the default): `{store-slug}.dzbuild.app` 301-redirects to the custom domain. * Free address primary with the redirect on: the custom domain 301-redirects to `{store-slug}.dzbuild.app`. * Redirect off (**Send visitors of the other address to the primary address** switched off): both addresses serve the storefront. * If a store is reached on a subdomain host other than the one selected for it (`dzbuild.app` vs `minacef.app`), it 301-redirects to the selected one. ## Buying a domain from DZBuild From the **Buy domain** tab you can search availability across 14 TLDs — `.com` `.net` `.org` `.info` `.store` `.shop` `.online` `.site` `.app` `.io` `.co` `.me` `.xyz` `.tech`. Prices are shown in DZD for the first year; the renewal price can differ. Premium and Early-Access (EAP) domains are not sold. Payment is **instant, by card only**: * **CIB / EDAHABIA** via Slick-Pay * **Global card — Visa / Mastercard / PayPal / Apple Pay** (billed in US dollars) Manual BaridiMob or CCP receipts are no longer accepted for domain purchases. Track the purchase in the **Order history** tab (statuses: pending, paid, processing, completed, rejected, refunded). Payment is instant, but the registration itself is completed by the DZBuild team: the order moves from **paid** to **completed** once they register the domain with the registrar. At that point DZBuild wires the DNS and SSL to your store automatically. A domain bought here is registered for one year, and nothing is charged automatically when that year ends. DZBuild sends you a reminder about a month before it expires, and you renew it for another year with **Renew for 1 year** in the **Your purchased domains** card, paid instantly by card like the first purchase. Buying a new domain requires a Pro, Unlimited or Enterprise plan that has not expired, and your store must not have a different custom domain linked; remove that one first with **Remove** in the **Your store's addresses** card. Renewing a domain you bought here does not require a paid plan. ## When your subscription lapses Your custom domain is unlinked automatically About **12 hours** after your subscription expires, DZBuild unlinks the custom domain and your storefront reverts to `{store-slug}.dzbuild.app`. This also applies when the 3-day Pro trial ends. You keep the domain at your registrar; you simply re-link and re-verify it after renewing. Note that the 12-hour grace applies to an expiry date passing: a store that has been reset to the Free plan, or that has no expiry date at all, can be unlinked sooner. ## Removing a domain Click **Remove** next to the connected domain. We stop accepting traffic on it within seconds and your storefront reverts to `{store-slug}.dzbuild.app`. The domain is **not** deleted at your registrar — that's still your CNAME until you remove it there. ## SSL renewal Certificate renewal is fully automatic and needs nothing from you — no CSR, no upload, no renewal calendar. There is **no renewal-failure email and no renewal banner** today, so nothing will alert you if a certificate ever stops renewing. If your storefront starts showing a certificate warning, check that the CNAME still resolves and contact support. ## Frequently asked **Q: Can I change my default subdomain slug?** A: Not from the dashboard. Open a support ticket with your account email, the current store link and the link you want, and the team can move you to the new slug. Attaching a custom domain is the other option. **Q: Custom domain on a Pro plan?** A: Yes — **one** custom domain per store, on any paid plan. Pro, Unlimited and Enterprise all allow exactly one; none of them allow more. Free has no custom-domain support; only the default `{store-slug}.dzbuild.app` subdomain works there. Upgrade from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe); the **▶ How to renew** button on that page launches a guided in-app tour, and video walkthroughs are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). **Q: Can I use a domain bought through Google Domains / Namecheap / Hostinger / OVH?** A: Yes. Any registrar works — just set the CNAME record. **Q: My domain still shows "Waiting for DNS" after a few hours.** A: DNS propagation can take up to 24 hours, but typically completes in minutes. Run `dig +short cname yourbrand.com` to verify your CNAME is live. If it returns `link.dzbuild.app`, give it another 30 minutes; otherwise re-check the registrar configuration. **Q: `dig +short cname` returns nothing — is that a failure?** A: Not necessarily. If you proxy the domain through Cloudflare, the CNAME is flattened to Cloudflare A records and no CNAME is visible. DZBuild recognises Cloudflare's edge addresses and accepts that setup at verification. **Q: Can I have a custom domain *and* keep the dzbuild.app subdomain working?** A: Yes. Once the custom domain is working, open the **Your store's primary address** card, turn off **Send visitors of the other address to the primary address** and click **Save**: both addresses then serve the storefront. If you would rather keep the free address as the main one, make it primary instead; the custom domain then sends its visitors there. --- Source: https://dzbuild.com/docs/operations/fake-orders.md # Fake orders and customer bans A COD store takes orders from anyone who fills in a form, so some of them are not real. DZBuild gives you a probability score on every order, a ban list per store, and two add-ons that slow floods down. None of them decides for you: calling the customer before you hand a parcel to a courier is still the only certain filter. ## The fake-order probability score Every order carries a number that the dashboard labels *Probabilité de fausse commande* in French and `احتمالية طلب وهمي` in Arabic. You see it in four places: * as a coloured badge next to the customer name in the order list and in the mobile order cards, shown only when the number is above 0; * in the order popup, next to the phone number, with the risk word and, on recent orders, the IP address the order came from; * as a column on the **Customers** page, written as the word plus the number, for example `Faible (24)`; * on the **Blacklist** tab of that same page. The scale runs from 0 to 100 and a higher number means more suspicious. The colours in the table are the ones on the **Customers** page; the badge in the order list and in the order popup shows the same five bands in green, blue, yellow, orange and red. | Score | Word shown | Colour | | --------- | ---------- | -------- | | 0 to 19 | Safe | green | | 20 to 39 | Low | green | | 40 to 59 | Medium | amber | | 60 to 79 | High | red | | 80 to 100 | Critical | dark red | A 5 is therefore nothing to act on. It sits in the green band and the badge only appears because one small event was recorded once. A 60 is worth a phone call before you ship. The number belongs to the phone number rather than to the order, so it carries what that number has done before, on your store and on the rest of DZBuild. Moving an order to *cancelled* or *returned* pushes it up, whether you do it by hand or the courier's tracking does, and so does banning the number. An order that reaches *delivered* pulls it back down. The **details** button on a customer row opens the event log behind the number, so you can see what produced it. When the same person has ordered under several names or numbers (the **Multiple identities** column on the **Customers** page), the badge shows the highest score among the linked phone numbers and goes up for each extra name or number, so it can appear on a number with no history of its own. The score is a hint read from past order signals, not proof, and it never blocks or cancels anything on its own. When it is high, confirm by phone before shipping and cancel the order if the number is unreachable. ## Banning a customer from an order Open the order in the list and use the **Ban status** row of the popup: 1. Click **Ban**. 2. Choose a reason: fraud, fake orders, refusing to pay on delivery, abuse, spam, chargebacks, or other. 3. Add a note if you want the reason on record. 4. Set the scope with the checkbox `حظر رقم الهاتف أيضاً` ("ban the phone number too"). It is unticked by default, and the line under it says so: the default bans the device only. 5. Confirm. That checkbox is the part that matters. Left unticked, the ban follows only the browser the order came from: a new order from that same browser is refused, but the phone number stays free, so the same person ordering from another phone or browser goes through. If the order has no device record, the phone number is banned instead. Tick the box whenever you want the person actually stopped. Bans are per store. Banning someone on one of your stores has no effect on another store you own. ## Banning from the Customers page The **Customers** page in the dashboard carries the same action without the device question: the shield button on a customer row bans that customer's phone number and email address for this store. The **Blacklist** tab lists everyone you have banned with the reason, the ban date and an unban button, and the counter at the top of the page shows how many bans are active. When the same person has ordered under several names or numbers, the **Multiple identities** column shows a warning button. Opening it lists the linked names and numbers, and **Ban all identities** bans each of those phone numbers in one pass. Unbanning takes effect immediately and is written to that customer's event log. ## Why a banned customer can still order Four reasons cover the cases that reach support: * **The ban was device-only.** This is the default when you ban from an order, and it refuses new orders from that one browser only. The same person on another phone or browser orders normally. Ban the phone number instead. * **The person changed number.** A ban is matched on the phone number and the email address saved on the ban record. A number that has never ordered from you is a new customer as far as the store is concerned. * **The order came through a landing page.** Landing-page forms check the phone number and the device, but not the email address, so a customer banned by email alone can still submit one. Banning the phone number closes that path. * **A shared device or IP is not enough to block.** Families and internet cafés share both, so DZBuild records the match as a signal for you to read instead of rejecting the order. A buyer blocked on a landing page sees a message telling them the store owner blocked them and that this is not a technical fault of the site. At store checkout the message is shorter: they cannot complete an order from this store and should contact the store owner. ## Limiting order floods [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) caps how many orders one IP address can place inside a window, 3 per 12 hours by default. Every order from that address counts, whatever phone number it carries, so a flood that rotates numbers from one connection stops at your limit. The trade-off is worth knowing: Algerian mobile carriers put many subscribers behind one public address, so two strangers on the same carrier can share a counter. If genuine customers on mobile data report the wait message, raise the limit, 10 per 12 hours for example. The message they see says how long to wait and never mentions the address. Orders you create yourself from the dashboard are never counted. ## Captcha at checkout [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md) (Pro and above) verifies fast checkout, the full checkout page and landing-page forms. On **Normal**, the default, real customers see nothing. **High** and **Aggressive** also reject visitors coming through a VPN, a proxy or Tor, and a genuine customer browsing with a VPN gets the same generic error as a bot does. If your orders drop right after you raise the level, put it back on Normal before looking elsewhere. ## What is not available * **Filtering or blocking by traffic source.** Each order shows where it came from, but you cannot ban a source or filter the list by it, and this is not planned. * **Bulk deletion of orders.** Fake orders already in your list are cancelled one at a time. Bulk delete is planned, with no date. * **Automatic banning by score.** Nothing bans a customer for you, however high the number climbs. Every ban starts with you clicking it. --- Source: https://dzbuild.com/docs/operations/faq.md # FAQ ## Getting started **Q: Do I need a credit card to sign up?** A: No. Registering is free and needs no payment details, and **every store you create** starts on a 3-day Pro trial: the clock starts at store creation, not at signup. The one exception is an account opened through a free-plan offer link, whose first store starts on the Free plan with no trial. Sign up at `/register`. **Q: How long does it take to launch a store?** A: The setup itself is short: sign up, create the store, add 2-3 products, configure shipping and a courier, share the URL. How long that takes depends on how ready your product photos and prices are. **Q: Can I import products from another platform?** A: Yes, with CSV/Excel bulk import at [`/dashboard/products/bulk-import`](https://dzbuild.com/dashboard/products/bulk-import), available on **any paid plan** (not Free). Before the import runs you choose what happens to a row whose SKU already exists in your store: **Add as new products** (the default, so re-uploading the same file duplicates your catalogue), **Skip existing products**, or **Update existing products (same SKU)**, which updates price, stock, description and categories and keeps the current images. The import also respects your plan's product limit. For Shopify catalogues, use the **Shopify Import** add-on instead (requires Pro or above). **Q: Which language should I run my store in?** A: For Algeria, install the [Multi-Language add-on](https://dzbuild.com/docs/addons/multi-language.md) (requires the **Unlimited** plan or above) and run AR + FR. The default depends on your audience — French-first for premium / urban segments, Arabic-first for popular / regional segments. ## Pricing & billing **Q: Is there a commission on sales?** A: No. We never take a percentage of your sales. Pricing is a flat plan: Free (0 DZD), **Pro from 1,000 DZD/month** (10,000 DZD/year), **Unlimited from 2,500 DZD/month** (25,000 DZD/year) and **Enterprise from 5,500 DZD/month** (55,000 DZD/year, including 25 team seats — extra seats +200 DZD/month each, up to 200 total). Longer terms are discounted, and Enterprise is purchased self-service on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), not by custom quote. The **▶ How to renew** button on that page launches a guided in-app tour for upgrading; video walkthroughs are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). **Q: What's the 3-day Pro trial?** A: Every new store gets a Pro trial for 3 days, once per store, except the first store of an account opened through a free-plan offer link, which starts on Free. The length is fixed: there is no extension, no freeze and no second trial. When it lapses the store is treated as expired and locked out of paid features, and any linked custom domain is removed about 12 hours later. **Q: How do I pay?** A: Three options. (1) **Global card / PayPal / Apple Pay**: we accept Visa, Mastercard, PayPal and Apple Pay from anywhere in the world, charged in US dollars (your bank applies its own conversion fee, and the checkout shows the final USD amount before you confirm): instant activation, and the **Auto-renew** box is ticked by default (untick it to pay once; stop a running renewal from the *Card and invoices* link on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe)); (2) **CIB / EDAHABIA** via Slick-Pay: instant activation after the bank's confirmation; (3) **BaridiMob manual receipt**: pay, upload the proof at [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), and the team approves it, usually within 30 minutes. A coupon field is available before you pick a method. **Q: Can I downgrade?** A: There is no downgrade button. Buying a different plan takes effect **immediately**, and the unused value of your current plan is converted into days of the new plan by price ratio — so moving from Enterprise to Pro turns your remaining days into more Pro days, while moving up turns them into fewer days of the higher plan. To simply stop paying, let the plan run to its expiry date. Global-card subscriptions auto-renew and must be cancelled from the *Manage subscription* card to stop. **Q: What happens to the time I already paid for if I change plan?** A: Nothing is lost. The unused value is credited as days on the new plan by price ratio and applied immediately. Very long-dated ("lifetime") plans are never prorated. **Q: Can I get a refund?** A: A global-card payment can be refunded within 14 days of the charge. Open a billing ticket from the dashboard with the account email and the date of the payment. Payments made on the local rails (CIB, EDAHABIA and BaridiMob receipts) are final and cannot be refunded. On any rail, a wrong or duplicate charge reported within 14 days is corrected. **Q: What happens when my plan expires?** A: You receive a warning email as the expiry approaches and an expiry email afterwards. Your storefront goes offline (visitors see a subscription-expired page instead of your store), and until you renew the dashboard keeps only its home page, Subscribe, account and store settings, notifications, domains, AI credits and the affiliate page; any other page sends you to Subscribe. About 12 hours later your custom domain is unlinked. Your products, orders and customers are kept. Renewing restores access, but the domain has to be re-linked and re-verified. ## Orders, shipping, payouts **Q: How does Cash on Delivery (COD) work?** A: Default for Algerian stores. The customer pays the courier on delivery; the courier hands you the cash (minus their fee) on a weekly or monthly cycle depending on the courier. **Q: What order statuses are there?** A: Seven: `pending`, `confirmed`, `processing`, `shipped`, `delivered`, `cancelled`, `returned`. **Q: Why does an order say "pending" for hours?** A: It's waiting for you to call-confirm before shipping. Most Algerian merchants run a call-confirm flow. Once confirmed, ship. **Q: Can my customers pay by card on my storefront?** A: Physical-goods storefronts on DZBuild are **cash on delivery only**. Card checkout for physical orders is planned, with no date announced. **Digital stores** work differently: with the Payment Gateway add-on you publish your own methods under Digital payment settings. A **CIB / EDAHABIA card** method runs on your own Slick-Pay account, whose public key you paste in: the buyer pays by card at checkout, and once the payment is confirmed the order is confirmed and the item delivered automatically. The manual methods (Redot Pay, CCP, BaridiMob, or any bank transfer you describe yourself) work on proof: the buyer pays you and sends the proof, nothing is verified automatically, and the order stays `pending` until you confirm the payment, then you mark it delivered. **Q: How do I handle returns?** A: Mark the order `returned` at [`/dashboard/orders`](https://dzbuild.com/dashboard/orders). A return or a cancellation you set yourself puts the items back in stock at once, if they had been deducted. Under the default **Stock deduction** setting stock leaves at `confirmed`, so cancelling a still-`pending` order changes nothing; a store set to **On order receipt** gets the items back even from `pending`. When the courier's tracking marks a parcel returned, the stock comes back when the courier reports the parcel back with you, when you click **Return received** in the order popup (or tick several returned orders and use **Returns received**), or by itself 15 days after the return. For COD there is no refund (the customer never paid). **Q: Which couriers can I use?** A: The tile grid lists **102 couriers**. It holds the direct integrations (Yalidine, Yalitec, Guepex, Easy & Speed, NOEST, Maystro, ZR Express, Abex Express, Zimou, Colivraison, EcomDelivery, Elogistia and others), a generic "custom Ecotrack tenant" tile, and 82 named Ecotrack-powered carriers (DHD, Conexlog, MSM Go, World Express and the rest). Nothing is marked "coming soon"; you can link several at once and choose which to use when sending each order. Which wilayas and communes you can ship to comes from your own contract with that courier, not from DZBuild. Connect them at [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping) ("Link delivery companies"); [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) is for your shipping **rates**. ## Custom domains **Q: Can I use my own domain?** A: Yes — **one** custom domain per store, on any paid plan (Pro, Unlimited or Enterprise). Unlimited and Enterprise do not allow more. Free does not support custom domains. You can link a domain during the 3-day Pro trial, but note that about 12 hours after any plan expires DZBuild automatically unlinks the domain and your storefront reverts to `{slug}.dzbuild.app` — re-link it after renewing. See [Custom domain](https://dzbuild.com/docs/customizing/custom-domain.md) for the DNS walkthrough. **Q: My custom domain isn't working.** A: Most issues are DNS. Run `dig +short cname yourbrand.com`; it should return `link.dzbuild.app`. If you proxy the domain through Cloudflare, the CNAME is flattened and returns nothing visible; that setup is accepted too. If DNS looks right and DZBuild still shows "Pending", wait: a DNS change usually propagates in minutes, but it can take up to 24 hours. If you moved the domain's nameservers instead of adding a CNAME, turn DNSSEC off at your registrar first, or resolvers keep serving the old records. Still pending after 24 hours: contact support. **Q: Can I keep both my custom domain and the `.dzbuild.app` subdomain?** A: No. Once your custom domain is verified, `{slug}.dzbuild.app` permanently 301-redirects to it — it stops serving the storefront and is not a fallback if the custom domain breaks. Remove the custom domain at [`/dashboard/domains`](https://dzbuild.com/dashboard/domains) to bring the subdomain back. See [Domain management](https://dzbuild.com/docs/operations/domains.md). ## Storefront **Q: Can I block visitors from outside Algeria?** A: No. There is no country/geo blocking in Settings today. The closest available controls are the **Captcha Protection** add-on (requires Pro) and the **Limit orders per IP** add-on (free), both at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons). **Q: Can I run a store-wide sale (X% off everything)?** A: Two ways. (1) **Promo codes** — turn on the free Promo Codes add-on at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons), then create percentage or fixed-amount codes at [`/dashboard/promo-codes`](https://dzbuild.com/dashboard/promo-codes); the customer has to enter the code. (2) **A real store-wide markdown** — select products on [`/dashboard/products`](https://dzbuild.com/dashboard/products) and use the bulk **Price → decrease by %** action (up to 100 products per action), optionally setting a compare-at price so the old price is struck through. **Q: How do I switch themes?** A: [`/dashboard/themes`](https://dzbuild.com/dashboard/themes) → Store tab. Seven themes are selectable, each with a minimum plan: **Starter**, **Brico** and **Digital** (Free — Digital is for digital-product stores only); **Started V2** (Pro); **Prestige** and **Bloom** (Unlimited); **Promobi** (Enterprise). Switching is instant and your products and content carry over, but section-level customisation is per theme. **Q: How do I add a blog?** A: A storefront blog is planned, with no date announced. For now, link to a separate CMS (Ghost, WordPress) from your storefront footer. ## Multi-store & team **Q: Can I have multiple stores under one account?** A: Yes — see [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). **Q: Can I invite my team?** A: Yes — see [Team](https://dzbuild.com/docs/operations/team.md). ## Account **Q: How do I change my email?** A: `/dashboard/account` → Change email. Requires verification on the new address. **Q: How do I delete my account?** A: Open a ticket and attach a screenshot of your account settings page in the app showing the email (and the phone number, if you added one) linked to the account. The team confirms the account is yours, and after 30 days it is deleted in full: the store, its products, orders, customers and uploaded files go with it and cannot be restored. Export anything you want to keep before you ask. **Q: Lost access — how do I recover?** A: Use **Forgot password** on the login page. Two-factor authentication uses an authenticator app (TOTP), not SMS — if you lose the phone, sign in with one of the **backup codes** you saved when you enabled it (`/dashboard/account` → Security), or regenerate them from there while still signed in. Only if you have neither the app nor a backup code do you need to contact support with proof of identity. ## Technical **Q: Is my data backed up?** A: Yes. Your store data is backed up automatically every day, with additional off-site copies kept for several weeks. Nothing is required from you. **Q: Where is data hosted?** A: European data centers (low-latency to Algeria), with global edge caching. **Q: Do you have an API?** A: Yes, see [API Reference](https://dzbuild.com/api-docs/intro.md). REST-style at `https://api.dzbuild.app/v1/...`. Keys are self-service at [`/dashboard/api`](https://dzbuild.com/dashboard/api), on an active **Enterprise** plan and for the store owner only: team members do not get the page. You can hold up to 3 keys per store, and a key you mint there works straight away. **Q: Webhooks?** A: Yes, the Webhooks add-on (n8n / Make / Zapier) requires the **Unlimited** plan or above. Unlimited allows **1 endpoint**, Enterprise allows **3**. See [Webhooks](https://dzbuild.com/api-docs/webhooks/overview.md). ## Still stuck? * Email **** * Telegram **[@dzbuild](https://t.me/dzbuild)** * Contact form on `dzbuild.com/contact` --- Source: https://dzbuild.com/docs/operations/google-sheets.md # Google Sheets sync DZBuild's Google Sheets integration keeps a spreadsheet of your store data. Orders and abandoned carts land in it as they happen; products and customers reach it through the manual export described below. ## Setup 1. Go to `/dashboard/addons/google-sheets`. 2. Click **Connect Google** and authorize via Google OAuth. 3. Click **Create new sheet** (or link an existing sheet the app created). The form asks whether to copy your past orders in (**Add all past orders**) or start with an empty sheet that fills from the next order (**Only new orders**), and where new orders go: **Bottom (oldest first)**, the default, or **Top (newest first)**. The background sync starts immediately. If the token expires later, the page will prompt you to reconnect. ## What syncs | Data type | Columns written | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Orders | order number, date, customer name, phone, wilaya, commune, address, products, variants, quantity, unit price, subtotal, shipping cost, discount, total, status, offer name — plus optional columns you can switch on: notes, promo code, delivery type, SKU, wilaya number. Courier and tracking number are **not** exported to Sheets. | | Products | product id, name, price, old price, stock, category, has-variants flag, variants, status — plus one optional column you can switch on: SKU. | | Customers | customer id, name, phone, email, wilaya, commune, number of orders, total spent, registration date | | Stock updates | Nothing is written automatically. The per-sheet **stock updates** switch saves a setting that has no effect today: a stock change does not touch the sheet. The quantity in the **Products** tab is whatever the last full export wrote, so re-run **export now** when you need current numbers. There is no separate Inventory tab, and variant-level stock is never written (the Products tab's *variants* column is a text summary written by that same export). | | Abandoned carts | cart id, phone, name, wilaya, commune, products, item count, cart total, status, created date, last activity — plus optional columns you can switch on: source page, email, wilaya number, variants, SKU. | The first sheet you connect syncs all of the above. Additional sheets default to **orders-only**. Only orders and abandoned carts are written as they happen. Products and customers reach the sheet through the manual **export now** run described below, not as you edit them. ## Per-sheet settings and columns Every connected sheet has its own settings, so one sheet can be an orders log for your call-confirm team while another is a full catalogue export: * **Which data types it receives** — orders, products, customers, stock updates, abandoned carts, or orders-only. * **Auto-sync on or off** for that sheet. * **Which columns appear, and in what order.** Three drag-and-drop lists with a switch on every row: 22 order columns, 10 product columns and 16 abandoned-cart columns. Order number is locked on and cannot be switched off. Customers have no column list at all, only the whole-sheet switch above; their 9 columns are fixed. When you create a sheet you can also scope it to a **specific list of products** instead of the whole catalogue. ## Exporting everything at once Besides the live sync, there is a manual **export now** action that pushes existing data into the sheet in one pass — orders, products, customers, abandoned carts, orders + carts, or all of it. It runs in the background with a progress bar and is limited to 10 runs per minute. ## Status changes are written back When you change an order's status in the dashboard, DZBuild updates that order's **existing row** in the sheet rather than appending a duplicate. The same applies to abandoned carts (`abandoned`, `contacted`, `recovered`, `expired`), and abandoned-cart rows are colour-coded by status. ## Active-sheet limits by plan | Plan | Max active sheets | | ---------- | ----------------- | | Free | 1 | | Pro | 6 | | Unlimited | 10 | | Enterprise | 30 | If you hit the limit you'll see: *"لقد وصلت إلى الحد الأقصى للأوراق المفعلة"*. Disconnect an unused sheet or upgrade your plan. ## Troubleshooting | Issue | Fix | | --------------------------------------------------- | ------------------------------------------------------------------------- | | "Token expired" / reconnect prompt | Click Reconnect and re-authorize Google | | Sheet stops updating | Check connection status; Google revokes tokens after prolonged inactivity | | Can't create more sheets | Plan limit reached — see table above | | Page says "not connected" although you connected it | The stored token could not be read; just re-link via **Connect Google** | **Disconnect** does more than clear the link: it also revokes DZBuild's access on Google's side and wipes the stored tokens, so reconnecting means authorizing from scratch. ## Octomatic [Octomatic](https://octomatic.shop) is a third-party fulfillment tool that connects to DZBuild **via Google Sheets**. Set up Google Sheets first, then follow the guide at `/dashboard/addons/octomatic`. Octomatic reads the **Delivery type** cell word for word, so the text DZBuild writes there must be one of the words it recognises (for example `desk` or `مكتب`). Change that text for home, desk and pickup orders under **Delivery type text in the sheet** on the Google Sheets page; orders written after the change use it. 📺 [Google Sheets setup tutorial](https://www.youtube.com/watch?v=YymREJXr53k) --- Source: https://dzbuild.com/docs/operations/mobile-app.md # Mobile app The dashboard on a phone is the same dashboard as on a desktop: same account, same orders, same settings. What changes is how you open it. On Android there is a DZBuild app on Google Play; on iPhone and iPad you install the dashboard itself as a home-screen app. Both give you push alerts for new orders. ## Where to get the Android app Three places lead to the same listing: * The Google Play page directly: `https://play.google.com/store/apps/details?id=com.dzbuild.app` * The Google Play icon in the dashboard top bar. It only appears when you browse the dashboard from an Android phone, and it is hidden once you are already inside the app. * The **Android app** card under **Everything you need to run your store** on [`/dashboard/community`](https://dzbuild.com/dashboard/community). There is no separate app account and no separate app plan. The app opens the dashboard you already use, so your stores, orders and add-ons are exactly where you left them. ## iPhone and iPad There is no App Store build. On iOS you install the dashboard as a home-screen app instead: 1. Open dzbuild.com in **Safari** and sign in. 2. Tap the **Share** button. 3. Choose **Add to Home Screen**, then confirm. The icon that lands on your home screen opens the dashboard full screen, without the Safari address bar, and starts on `/dashboard`. This is the same instruction the notifications page shows on iOS, and it is also the step that makes push alerts possible on an iPhone. The same install works on Android browsers if you would rather not use the Play Store app. ## Push alerts on your phone Push is switched on per device at [`/dashboard/notifications`](https://dzbuild.com/dashboard/notifications), under the app notifications row. Inside the Android app, the first time you turn the switch on, Android asks for the notification permission. Once you allow it the switch stays on and is managed from the phone's own settings: Settings, then Apps, then DZ Build, then Notifications. If you refused earlier, the dashboard shows that note and points you to the same place. When a notification arrives while the app is open, it slides in as a banner at the top of the screen for a few seconds, and tapping it opens the page the alert refers to. In a mobile browser, or in a dashboard you installed to the home screen, the same switch subscribes that browser and can be switched back off from there. On iPhone the switch cannot do anything until you have installed the dashboard to the home screen and opened it from the icon. The **Connected devices** count on that page adds up the browsers subscribed for the store and counts the Android app once, however many phones run it. It confirms that a new browser registered, not that a second phone running the app did. ## Signing in on the app The app uses the same email and password as the website, and the same login page, so anything that blocks you on the site blocks you in the app too. * **You signed up with Google.** The app's form asks for a password. When an account is created through Google sign-in, DZBuild emails you a password. Search your inbox and your spam folder for "dzbuild". If it is nowhere to be found, use **Forgot password** on the login page and set a new one. * **Two-factor is on.** After the password, the app asks for your code exactly as the website does. * **Several wrong attempts in a row.** The login page then asks you to pass a captcha before it accepts another try. Wait a moment, complete the check, and sign in again. * **The same details work in Chrome but not in the app.** Open a support ticket with the email address you are using and a screenshot of the error. Screenshots, not videos. ## Using more than one phone Nothing limits you to a single device. Sessions are independent, so signing in on a second phone does not sign you out on the first, and you can keep the dashboard open on a laptop at the same time. Every device that enables push registers on its own and gets the alerts. The **Connected devices** number goes up for each browser you add, but a second phone running the Android app does not change it. Turning alerts off on one phone leaves the others alone. If several people run the store, give each of them their own login instead of sharing yours: see [Team](https://dzbuild.com/docs/operations/team.md). If you own several stores, the store picker behaves in the app exactly as it does in the browser: see [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). ## Frequently asked **Q: Is there an iPhone version in the App Store?** A: No. On iOS, install the dashboard from Safari with **Add to Home Screen**, as described above. **Q: Do my customers need to install anything?** A: No. Your storefront opens in any phone browser. The app is for you, the merchant. **Q: The Google Play button is not in my dashboard.** A: It is shown only to Android browsers, and it is deliberately hidden when you are already inside the app. From a computer or an iPhone, open the Play Store listing directly with the link above. --- Source: https://dzbuild.com/docs/operations/multi-store.md # Multi-store A single DZBuild account can own multiple stores. Each store has its own products, orders, customers, theme, domain **and subscription** — but you sign in once and switch between them in the dashboard. What it takes to open another store Multi-store is available to merchant accounts — the store picker appears in the dashboard sidebar when it is available to you. To create an additional store, **every store you already own must currently be on an active, unexpired paid plan (Pro, Unlimited or Enterprise) that you have paid for.** A store still on the free 3-day Pro trial does not count. You also have to wait 5 minutes between store creations. There is no per-plan store quota; the practical limit is that each extra store needs its own paid subscription. Renew or upgrade from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) — the **▶ How to renew** button on that page launches a guided in-app tour, and video walkthroughs are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## When to use multi-store | Use case | Example | | -------------------- | -------------------------------------------------------------------- | | Different brands | "Brand A" and "Brand B" with separate themes and audiences | | Different categories | Fashion + Electronics on separate storefronts | | Different markets | Algeria-only and international, with different couriers / currencies | | Test sandbox | Try a new theme or product strategy without touching your live store | If you just want a multilingual storefront, install the [Multi-Language add-on](https://dzbuild.com/docs/addons/multi-language.md) — that's a single store with multiple languages, simpler than running two stores. ## Creating an additional store Open the **store-picker** at the top of the dashboard sidebar → **Create new store**. Walk through the same flow as your first store. The new store is provisioned in seconds and you're switched into it. **Create new store** only appears in the picker when you are eligible: every store you already own must be on an active paid plan, and at least 5 minutes must have passed since your last store creation. If the option is missing (with a single store, the whole picker stays hidden until you are eligible), pay for any store that is still on its trial or whose plan has lapsed, then check again. ## Switching between stores Click the store-picker → pick another store. The dashboard reloads in that store's context — products, orders, settings all flip to the new store. Each entry in the picker carries that store's **own plan badge**, a useful reminder that plans are per store. A plan change you just made can take a moment to show there. Stores using the **Digital** theme have a different dashboard surface (digital orders, digital payment settings, digital storage), so switching between a physical store and a digital store changes which menu entries you see. Important: every dashboard change (saving a product, updating shipping rates, editing a domain) applies to the store you are currently switched into — switch to the right one before making changes. ## Shared vs. per-store | Shared across all your stores | Per-store | | ----------------------------- | ---------------------------------------------- | | Login, password, 2FA | Products, categories, orders, customers | | Account-level email + name | **Subscription plan, expiry and invoices** | | — | **Team members** | | — | **AI credits balance** | | — | Theme + branding + custom CSS | | — | Domains, payment methods, courier integrations | | — | API keys, pixels, abandoned-cart settings | | — | Add-on activations | Each store carries **its own** subscription — its own plan, its own expiry date, its own invoice. Being on Pro for Store A does not make Store B Pro; if Store B lapses, it is locked out of paid features and you also lose the ability to create further stores until every store is paid again. ## Team members are per store Team members cannot be shared between stores. An invite is rejected if the email address already has a DZBuild account, so one person can staff only one store — staff each store with its own set of previously-unregistered invitees. See [Team](https://dzbuild.com/docs/operations/team.md). ## API and multi-store Each store has its own API keys. There is no cross-store endpoint — operate one store at a time. To work with both stores from a script, generate a key per store and authenticate per-call. See [API authentication](https://dzbuild.com/api-docs/authentication.md). ## Multi-store gotchas * **Check which store is active** before you edit: changes apply to the store you are switched into. If a stale browser tab submits a change for the wrong store, DZBuild still validates ownership before applying it. * **AI credits are per store.** Each store has its own balance, purchases and usage history at [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) — credits bought for Store A cannot be spent on Store B. * **Add-ons activate per store.** Activating Captcha Protection on Store A does not turn it on for Store B. ## Deleting a store or the account There is no self-service deletion in the dashboard, for a single store or for the whole account. Open a support ticket and attach a **screenshot of your account settings page inside the app**, showing the email address (and the phone number, if you have one) linked to the account. That screenshot is how the team confirms the request really comes from the account owner. Once the team has confirmed it, the account is deleted in full after **30 days**. Export anything you still want to keep before you send the request. ## Frequently asked **Q: How many stores can I have?** A: There is no per-plan store quota. You can keep creating stores as long as every store you already own is on an active paid plan you have paid for (a trial does not count), with a 5-minute gap between creations. **Q: Can I move products between stores?** A: Not in one click, but there is a product export. Connect the [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md) add-on on Store A and use its **Export products** tile: your catalogue lands in a sheet you can download as CSV, reshape, and feed to Store B's bulk import. If the catalogue already exists in Shopify, the **Shopify Import** add-on is the shorter path. Bulk import always creates new products, so it works fine as the destination side. Ask support if you need a one-off catalogue copy. **Q: Can one store sell digital and physical products together?** A: No. A store runs in one mode. Open a second store on the same account for the other kind of product and switch between them in the store picker. **Q: I paid for the wrong store. Can the remaining period be moved?** A: Yes, on request. Open a support ticket with your account email and the links to both stores, and the team moves the remaining paid period across. **Q: Can two team members work on different stores at the same time?** A: Yes — sessions are independent, and each member belongs to one store anyway. --- Source: https://dzbuild.com/docs/operations/notifications.md # Order notifications DZBuild alerts you on two events, a **new order** and an **order status update**. Where those alerts land is set at [`/dashboard/notifications`](https://dzbuild.com/dashboard/notifications), a page made of one card per channel: browser and app push, email, Telegram, and Discord. On a narrow screen, the row of icons at the top jumps to a card. The page holds settings only. There is no notification inbox and no history. A new order does pop as a live toast without a refresh, but only on two pages, the orders list and the Advanced Orders page, as the [Dashboard tour](https://dzbuild.com/docs/getting-started/dashboard-tour.md) explains. Only the store owner can press **Save settings**. A team member who has permission to edit settings sees a lock note instead of the save button, but can still connect their own Telegram or Discord account and switch their own rows on or off. ## Video tutorial [Order notifications](https://www.youtube-nocookie.com/embed/2xYGIzEK5eI) ## Email notifications The recipient is your **account email**, shown at the top of the card. It is not the public store email, so to change where the mails go, change your account email at `/dashboard/account`. Inside the card there is one master switch, **Enable email notifications**, and one switch under it, **New order**. The status-change switch is not on this card: it sits on the browser and app push card as **Status change**. Push has its own switches The email switches control email only. A new order reaches every browser and phone where push is on, even with **Enable email notifications** or **New order** off. Status changes reach those devices only while **Status change** on the push card is on (the person who made the change is not alerted), and that switch is saved with **Save settings**. ## Browser and app push One switch, at the top of the page. Flipping it on is what asks the browser for permission, so nothing is requested until you act. Flipping it off unsubscribes that one browser. Each browser or device you enable it in counts separately. The **Connected devices** chip on the card adds up the browsers subscribed for this store, your team's included, and counts the Android app once if it is on at least one of your phones. Enabling push on your laptop does not enable it on your phone. Inside the DZBuild Android app the switch row is labelled **App notifications**, and once you have granted permission the switch locks in the on position. Android only lets the app itself ask once, so turning it back off is done in the phone settings, under Apps, DZ Build, Notifications. If the browser has already blocked notifications for the site, the card says so and the switch is disabled. Click the padlock next to the address bar, allow notifications, then reload the page. ## Telegram This is the channel most Algerian merchants end up using, because it rings on the phone with no app install. 1. In the Telegram card, click **Connect Telegram**. A one-time code appears and stays valid for 15 minutes. 2. Open the bot with the **Open @dzbuildbot** button, or search `@dzbuildbot` in Telegram yourself, and send it the code. 3. The page is polling while you do this. It confirms the link and reloads on its own; there is nothing to press. If the code runs out, **Generate a new code** issues another one. The **Enable Telegram notifications** switch stays greyed out until at least one account is linked. Each linked account then has its own two switches, **Orders** and **Statuses**, which save the moment you click them, without the Save button. A freshly linked account starts with orders on and status updates off. How many accounts you can link depends on the plan, and the chip on the card shows the count against the limit: | Plan | Linked Telegram accounts | | ---------- | ---------------------------------------------------------------------------------------- | | Free | 1 | | Pro | 2 | | Unlimited | 4 | | Enterprise | One per staff seat plus the owner: at least 26, and no limit on the unlimited-staff size | When the seats are full the card says so instead of offering the connect button. Unlink an account with the small **x** on its row. Check whose account is linked A linked Telegram account receives the customer's name, phone number and address with every order. The owner sees a reminder on the card for exactly this reason. If a row is an account you do not recognise, unlink it now. A team member's linked account keeps receiving alerts only while that member is still active on the team and still holds permission to edit settings. Remove the member or take the permission away and their Telegram goes silent by itself, with no extra step in this page. ## Discord Two slots per store: one **server channel** and one **direct message**. You can use either, or both. Click **Link Discord** and the card gives you a code plus the command to send. To bind a channel, add the bot to your server with the **Add the bot to the server** button, open the channel you want the alerts in, and send `/dzbuild link code:` followed by your code. To bind your DMs instead, skip the invite and send the same command in a private conversation with the bot. One code works for both slots. Each bound slot gets the same pair of instant-saving **Orders** and **Statuses** switches as a Telegram row, and the same **x** to unbind it. ## Notifications on your phone Three ways, and DZBuild sends no SMS at all: * **Telegram**, once an account is linked. Nothing to install if you already use Telegram. * **The Android app**, from Google Play. The download button appears in the dashboard top bar when you browse from an Android phone, and it is hidden everywhere else. * **The dashboard installed to the home screen.** On iPhone and iPad this is the only route to push: Safari does not deliver web push to an ordinary tab, so open the dashboard in Safari, use Share then **Add to Home Screen**, open the installed icon, and enable push there. The card shows this hint when it detects an iOS device. ## When an alert never arrives Work down this list before opening a ticket: * **The device switch.** Push is registered per browser and per phone: open this page on the device that stays silent and check that its switch is on. For status changes, **Status change** on the push card must be on too. * **The channel switch.** Telegram has both a card-level switch and a per-account **Orders** switch, and both have to be on. * **The phone put the app to sleep.** Android battery optimisation delays or drops background notifications. Open the phone settings, Apps, DZ Build, Battery, and set it to unrestricted. * **A device you never re-enabled.** Clearing browser data, or reinstalling the app, drops the subscription. Reopen the page on that device and flip push on again. * **The wrong store.** Settings are per store. If you run several, switch into the store you expect the orders in and check its own page. * **The email landed in spam.** Search your inbox for `dzbuild` before concluding nothing was sent. If alerts still fail after all of that, open a ticket from the support chat and say which channel, which store, and when the last order arrived. --- Source: https://dzbuild.com/docs/operations/support.md # Contact support DZBuild support runs through a chat built into your dashboard. Everything about support is gathered on one page, **Community & Support** in the sidebar, at [`/dashboard/community`](https://dzbuild.com/dashboard/community): the chat, tickets, the help center, the server status page, the official channels and the platform news. When you write from inside the dashboard, the conversation carries your account and the store you have open, so the team knows who is writing and about which store. The chat opens in your dashboard language, Arabic or French. ## Open the support chat There are three ways in: * **The chat bubble** in a bottom corner of the dashboard, on the left in Arabic and on the right in French. * **Contact support** at the top of **Community & Support**, or **Live chat** in its **Direct support** card. Both open the same chat. * **Chat with us** under **Need help?** on the subscription page, [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). The bubble is hidden on the busier pages so it does not sit over their buttons: orders, products, categories, customers, abandoned carts, landing pages, A/B tests, add-ons, customization, domains, AI credits, the subscription page, and the payment and storage pages of a digital store. From those pages, open **Community & Support** and use **Live chat**. The chat works the same way inside the DZBuild Android app. ## Open a ticket **Create a ticket** sits next to the chat buttons on **Community & Support**. It opens the same chat with a first message already typed for you, saying you want to open a support ticket. Send it, then describe the problem in the same conversation. Put in your first messages what the team needs to look the problem up: * what you were doing, and the link of the page where it went wrong; * the exact error message, copied as text or as a screenshot; * the order number, when the problem is about an order; * the store's name, if the problem is in a store other than the one you have open. Some requests have no button in the dashboard and are handled through a ticket, among them deleting your account ([Account and password](https://dzbuild.com/docs/operations/account-and-password.md)) and changing your store's default link ([Domain management](https://dzbuild.com/docs/operations/domains.md)). Those pages say what to include. ## When your plan has expired While a paid plan is expired, the sidebar hides **Community & Support**, and opening the page sends you to the subscription page instead. Support stays reachable from there: click **Chat with us** under **Need help?**. The chat bubble also stays on the dashboard home, settings, account and notifications pages, which remain open on an expired plan. ## Without signing in If you cannot sign in, or you do not have an account yet, use the contact page at [dzbuild.com/contact](https://dzbuild.com/contact). It offers the same live chat, the address ****, and a form. The form asks for your full name, your email, a subject and your message. The subjects are General question, Technical problem, Subscriptions and payment, Suggestion or idea, Partnership, Complaint and Other. **Send message** stays disabled until the verification check under the message has passed. ## Help center and resources **Help center**, at the top of **Community & Support**, opens `help.dzbuild.com` in your dashboard language. Further down, the **Everything you need to run your store** section holds five cards: | Card | What it opens | | -------------------------- | ------------------------------------------------------------------------------------------------------------ | | **Official documentation** | These docs, in Arabic or French to match your dashboard | | **The blog** | `blog.dzbuild.com`, articles and tips for selling online | | **Android app** | The DZBuild app on Google Play, described in [Mobile app](https://dzbuild.com/docs/operations/mobile-app.md) | | **Server status** | `status.dzbuild.app`, which shows whether the platform is working | | **GitHub** | DZBuild's open-source projects | When the dashboard or your store does not load, open [status.dzbuild.app](https://status.dzbuild.app) before writing to support. The **X** card in the channels section describes that account as the fastest place where outages and new features are announced. ## Platform news When the team has published news, a **News & Updates** banner on **Community & Support** shows how many items there are and the title at the top of the list. Click it to read them: pinned items come first, then the newest, ten at a time, with **Show more** for older ones. Each item carries its date and a type badge, such as **New feature** or **Fix**. Some news items also open as a pop-up over the dashboard. **Got it!** closes it, and **Read in the community** opens **Community & Support**. Once you close a pop-up, it does not show again in that browser. ## Follow DZBuild The **All our channels in one place** section lists the official accounts. The YouTube card has a **Get the updates** button that opens YouTube's subscribe confirmation for the DZBuild channel. TikTok, Facebook, Instagram, X and Threads each have a card with a **Follow** button. At the bottom of the page, **Leave a review** opens the DZBuild review form on Trustpilot. --- Source: https://dzbuild.com/docs/operations/team.md # Team & permissions Most DZBuild stores grow beyond a single owner. Team management lets you invite collaborators with scoped permissions, so a call-confirm operator doesn't accidentally change shipping rates and a finance reviewer doesn't ship orders. ## Where this lives Open [`/dashboard/team`](https://dzbuild.com/dashboard/team). The page shows two card sections, **Active members** and **Pending invitations**, plus an **Add member** button. An active-member card shows: * name and email * the member's role label * tags for the permissions they hold * the **date they joined** (not their last sign-in) If you have team-management rights, each card also carries **Edit permissions** and **Remove** buttons. A pending-invitation card shows the invited email address, the invitation's expiry date, and **Resend** / **Cancel invitation**. ## Roles and permissions A store has one **owner** — the account that created it — plus any number of **team members**. There are no Owner / Admin / Manager / Operator / Read-only roles: each member gets a free-text role label (for example "Orders manager") and a checkbox permission matrix. When you invite someone you pick one of three presets, or Custom: | Preset | What it grants | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Orders Manager** | Dashboard view; orders view / edit / export; customers view | | **Products Manager** | Dashboard view; products and categories view / create / edit | | **Full Access** | Everything **except** the Team and Domains permissions: members with it cannot open the Team or Domains pages | | **Custom** | Tick individual permissions across Dashboard, Orders, Products, Categories, Customers, Shipping, Landing pages, Pixels, Customization, Settings, Domains, Add-ons, Team and Analytics | Full Access is not everything The **Full Access** preset deliberately withholds two permissions: **Team management** and **Domain management**. Grant those only through the **Custom** preset, and only to people you fully trust — **Team management** lets a member invite and remove other members, and **Domain management** lets them link or remove your custom domain. The store owner is the account that created the store and cannot be changed from the dashboard. If you need to move a store to a different account, contact support. ### Permissions are enforced server-side Permissions are not just a UI filter. Where a page is gated, the check runs on the server: a member who lacks the permission is redirected back to `/dashboard` with an error, not merely shown a greyed-out link. The gating is not uniform, though. Most dashboard pages carry a permission check, but a number of them do not, and some of those still display store data. Treat permissions as the way you split work and prevent accidents inside a team you already trust, not as a wall around a stranger. ## Inviting a member 1. **Dashboard → Team → Add member** 2. Enter the new member's email address 3. Pick a preset (or tick Custom permissions) — the role label comes from the preset you choose; Custom members are labelled `staff` until you rename them via **Edit permissions** 4. **Send invite** The invitee receives an email with a join link valid for **7 days**. The email address must **not** already have a DZBuild account; if it does, the invite is refused. On the join page they create their account (first name, last name, phone, password); they are then signed in straight away and land in your store's dashboard with the permissions you granted, and later they sign in normally with that email and password. Automated abuse checks protect the join page; if you believe a legitimate invitee was blocked, contact support. Team membership is per store, and in practice a person can belong to only one store, because the invite is rejected for any email that already has a DZBuild account. To staff a second store you must invite a different, previously-unregistered email address. ### Why an invite is refused By a wide margin the most common cause is that **the email address already has a DZBuild account**. An invitation can only create a new account, so any address that has ever registered with DZBuild, including your own, is turned away. Ask the person for a fresh address they have never used here. The other two causes are your plan's seat limit (see the table below, and remember that a pending invitation already holds a seat) and the automated abuse checks on the join page. If a legitimate invitee is caught by those checks, contact support. ## Pending invitations An invitation stays in the **Pending invitations** section until it is accepted, cancelled or expires: * **Expiry** — 7 days from the moment it was sent. * **Resend** — issues a fresh link. * **Cancel invitation** — withdraws it and frees the seat. Pending invitations count against your plan's team-member limit, not just accepted members. ## Removing a member [`/dashboard/team`](https://dzbuild.com/dashboard/team) → on the member's card, click **Remove**. They lose access immediately. Their actions remain in the internal activity log. ## Activity log Team actions are recorded in an internal activity log (who, what, when, IP address). There is currently **no merchant-facing view or filter** for it on `/dashboard/team` — if you need the history, ask support to pull it. ## Best practices * **Orders Manager** for call-confirm staff. It keeps them out of pricing, discounts and settings, and is the safest preset for high-turnover ops teams. * **Products Manager** for catalogue work — product and category editing without touching orders or customers. * **Full Access** rarely. It covers shipping rates, payment settings and add-ons; only assign it to people you fully trust. * **Custom** whenever a preset is wider than the job. Tick only the modules the person needs. * **Rotate access** when team members leave. Remove them immediately. * **Encourage two-factor authentication.** Each person turns on TOTP 2FA (authenticator app plus backup codes) at `/dashboard/account` → **Two-factor authentication (2FA)**. It is available on **every plan**, and each person enables it for their own account; the store owner cannot turn it on for them or require it. ## Team-member limits per plan The number of additional team members you can add depends on the store's plan: | Plan | Team members (in addition to the owner) | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Free** | 0 — owner only | | **Pro** | 1 | | **Unlimited** | 3 | | **Enterprise** | **25, or unlimited**: 25 seats on the standard size, no seat limit on the unlimited-staff size (15,000 DZD/month); you pick the size when you subscribe | The owner does not count toward the limit. Pending invitations do. If you hit the limit and need to add another teammate, upgrade your plan from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). The **▶ How to renew** button on that page launches a guided in-app tour for upgrading; video walkthroughs are also on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Frequently asked **Q: Can a member belong to my team and another DZBuild merchant's team?** A: In practice no. An invite is rejected if the email address already has a DZBuild account, so one person can staff only one store. Use a different, previously-unregistered address for each store. **Q: How do I transfer ownership?** A: You can't from the dashboard — the owner is the account that created the store. Contact support if a store needs to move to a different account. **Q: How many members can I have?** A: 0 on Free, 1 on Pro, 3 on Unlimited, and 25 to 200 on Enterprise depending on the seats you bought. See the table above. The cap applies in addition to the owner, and pending invitations consume a seat. **Q: Can a member see more than one of my stores?** A: No. Team membership is per store — see [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). --- Source: https://dzbuild.com/docs/operations/what-you-can-sell.md # What you can sell DZBuild keeps no list of approved categories and reviews no product before it goes live. The rule is Algerian law: if you may legally sell it in Algeria, you may sell it from a DZBuild store. What the platform does decide is *how* you sell it, because a store is created as either a physical-products store or a digital-products store. ## Allowed products Anything legal in Algeria, physical or digital. **Physical goods** are clothing, electronics, cosmetics, home items, anything a courier carries to the buyer. These stores collect a wilaya, a commune and an address at checkout, and the buyer pays on delivery. See [Cash on delivery](https://dzbuild.com/docs/payments/cod.md) and the [couriers overview](https://dzbuild.com/docs/couriers/overview.md). **Digital goods** are e-books, courses, software, accounts, activation codes and downloadable files. These stores run the Digital theme, skip the address fields entirely, and hand the buyer the item instead of shipping it. See [Digital theme](https://dzbuild.com/docs/storefront/digital-theme.md). The [terms of service](https://dzbuild.com/terms) put the legality of your products, the accuracy of your descriptions and prices, order fulfilment, delivery and after-sales on you (section 5). DZBuild is the shop software, not the seller. ## Banned products and use Section 7 of the terms forbids using the platform to sell illegal, counterfeit or dangerous products, to defraud, deceive or impersonate anyone, to send spam, or for any activity contrary to Algerian law. A violation ends in account suspension or closure with no compensation. Nothing else is filtered. There is no category whitelist, no per-product review and no approval queue between hitting **Save** and the product appearing on your storefront. Digital sellers carry one extra obligation (section 6): deliver exactly what the product page describes, immediately after payment, through the platform's delivery mechanism, and handle your own buyers' complaints. ## One store, one kind of product Step 3 of store creation asks for the **type of products** and offers two choices: | Choice | Hint shown under it | | ----------------- | ------------------------------------------------- | | Physical products | Clothes, electronics, products that need delivery | | Digital products | E-books, courses, software, codes | Physical is preselected. The choice is a mode, not a skin: a digital store loses shipping rates, courier integration and cash on delivery, and gains secure storage, digital orders and its own payment settings. The [Digital theme](https://dzbuild.com/docs/storefront/digital-theme.md) page describes the switch and its confirmation dialog in full. One store runs one mode at a time. To sell both kinds, open a second store on the same account and set it to the other type. Each store carries its own subscription, so a second store means a second plan. See [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). ## Delivering digital goods Two paid monthly add-ons carry this section: **Secure Storage** holds the items, and **Payment Gateway** publishes the methods your buyers pay through. Prices for both are on the [Digital theme](https://dzbuild.com/docs/storefront/digital-theme.md) page. A digital store holds three kinds of item in its secure storage: **files** (PDF, ZIP, RAR and similar, up to 20 MB each), **accounts** (an email and a password) and **activation codes**. You load stock in bulk, one item is allocated per order, and the dashboard tracks what is sold and what is left. Download links are deliberately short-lived. Each one allows 3 downloads and stops working 30 days after delivery. Neither number is a setting you can change from the dashboard. Buyers pay through the methods you publish yourself. The digital payment settings let you add a **CIB / EDAHABIA card** method, which takes the public key of your own Slick-Pay account, lets the buyer pay by card at checkout and delivers the item as soon as the payment is confirmed. You can also add a manual method of type **Redot Pay**, **CCP**, **BaridiMob** or **Custom**, with your own account details, the account holder's name, a currency and its conversion rate to the dinar, an optional extra fee in percent (dinar methods only), and a choice between requiring a payment receipt or confirming automatically. Those accounts are yours: this is how your buyers pay you, and it has nothing to do with how you pay your own DZBuild subscription, which is covered in [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md). Recurring digital products do not exist yet. There is no way to bill a buyer every month. Sell each period as its own product, for example a one-month access product beside a three-month one. Recurring billing is planned with no date attached. ## Paperwork and account checks DZBuild asks for no identity document, no registre de commerce, no bank statement and no tax number. There is no document upload anywhere in signup or the dashboard, and no manual account review sitting between you and your first sale. The only check at signup is a numeric code emailed to the address you registered with. Enter it and the account is live. Signup also wants an Algerian phone number, in the same format the storefront requires. See [Create an account](https://dzbuild.com/docs/getting-started/create-account.md). No verification does not mean no rules. The terms require that you have the legal capacity to run a commercial activity (section 2) and keep you responsible for what you sell (section 5). Money never sits with DZBuild either. On physical orders the courier collects the cash and pays you directly on the courier's own schedule. On digital orders the buyer pays into the account you published. There is no payout account for DZBuild to verify, and no commission on any of it. ## Where your buyers can be Algeria, for now. Checkout accepts only an Algerian phone number: 10 digits starting with 0, or 12 digits starting with the 213 country code. A foreign number is rejected on the physical checkout and on the digital one, so a buyer abroad cannot complete an order even when the payment method you offer would have worked. Physical stores are further tied to Algeria by the courier network and the wilaya and commune address fields. Selling to buyers outside Algeria is planned. No date has been announced. Card payment at checkout for physical orders is also planned, with no date. Today physical buyers pay cash on delivery, and digital buyers pay through the methods you configure, which can include CIB / EDAHABIA card payment through your own Slick-Pay account. ## Frequently asked **Q: Do I need a registre de commerce to open a store?** A: No. DZBuild never asks for one, and no part of signup or the dashboard requests a document. The terms do require that you are legally able to trade, and the legality of your activity stays yours. **Q: Can I open a store using someone else's registre de commerce?** A: Nothing in the product checks a registration, so the platform will not stop you. Whether trading under someone else's registration is lawful is a question for Algerian law, and section 5 of the terms leaves that responsibility with you. **Q: How long does account verification take?** A: There is nothing to wait for. No document review exists. The email code arrives within seconds; if it does not, check the spam folder and request a new one. **Q: Does DZBuild take a commission on my sales?** A: No. There is no percentage on sales and no transaction fee. The subscription plan is the whole cost. Prices are on [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md). **Q: Can I sell to customers in France, Canada or the Gulf?** A: Not yet. Checkout requires an Algerian phone number, so orders from abroad cannot go through. Expansion beyond Algeria is planned without a published date. **Q: Can I sell one product that renews every month?** A: Not yet. Recurring billing for buyers is not built. Publish each period as a separate product and let the buyer repurchase when it ends. --- Source: https://dzbuild.com/docs/payments/cib-edahabia.md # CIB / Edahabia (Slick-Pay) DZBuild integrates **Slick-Pay** to accept CIB and Edahabia card payments. This integration is used so **you, the merchant, can pay DZBuild** — for your subscription, AI credits, paid addons and domains — directly from your card. For **customer-facing storefront** payments, see [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md) (physical stores) and, on Digital-theme stores, the Payment Gateway addon's methods: receipt uploads, or a CIB / EDAHABIA card method that runs on your own Slick-Pay account. For **paying DZBuild without a card**, see [Manual receipts](https://dzbuild.com/docs/payments/manual-receipts.md) — a BaridiMob transfer to DZBuild's RIP plus a receipt upload. ## What it covers The Slick-Pay integration is wired into six flows on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and related pages: * Plan upgrades and renewals — **Pro / Unlimited / Enterprise**, for 1, 3, 6 or 12 months. * AI-credit packs ([`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits)). * Copilot points packs ([`/dashboard/copilot/points`](https://dzbuild.com/dashboard/copilot/points)). * WhatsApp Sender message top-ups ([`/dashboard/whatsapp-sender`](https://dzbuild.com/dashboard/whatsapp-sender)). * Paid addons — the Digital theme's **Payment Gateway** and **Secure Storage** addons. * Domain purchases ([`/dashboard/domains`](https://dzbuild.com/dashboard/domains)), whose payment references are prefixed `DOM-`. When you pick **CIB / EDAHABIA** and press **Pay now** in any of these flows, DZBuild creates a Slick-Pay invoice and redirects you to Slick-Pay's hosted page. After 3-D Secure, you're redirected back to DZBuild and the platform records the payment. ## What you see 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) (or [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) / the addon page). 2. Pick the plan / pack / addon and the duration if applicable. 3. Pick the **CIB / EDAHABIA** payment option and press **Pay now**. 4. You're redirected to Slick-Pay's secure page. 5. Enter your card details + 3-D Secure code. 6. You're sent back to DZBuild and your purchase activates as soon as the platform confirms the payment. An interrupted payment can still be picked up, and the return link is what makes that reliable. The link that brings you back from Slick-Pay carries your payment reference in its address, so following it works in **any tab and on any device**: the subscribe page reads the reference, re-checks the payment and shows you the outcome. If you no longer have that link, reopening [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) **within 30 minutes in the same browser tab** does the same job, because the tab remembers the reference for that long. Lose both and the payment sits pending until someone looks at it, so contact support with your reference rather than paying a second time. The global-card rail below behaves the same way. ## Paying with a global card DZBuild accepts **global cards**. The same checkout sheet carries a second card rail — **Visa / Mastercard / PayPal / Apple Pay**, accepted from anywhere in the world. Use it when you don't hold a CIB or Edahabia card with online payments enabled, or when you'd rather pay in dollars. * It sends you to a secure hosted payment page and brings you back to the dashboard once the payment is confirmed; your card details never pass through DZBuild. * It is billed in **US dollars**, and the exact USD amount appears on the checkout before you confirm. A currency-conversion fee applies on the way from dinars to dollars, so the figure is a little above a straight conversion of the dinar price. * For a plan, the **Auto-renew** box is ticked by default: the card is charged again at the end of each period and the new period stacks onto your plan expiry. Untick the box to pay once for the duration you chose. Stop a running renewal, change the card or download receipts from **Card and invoices** on the subscription card of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe); it opens the billing portal. Addons, domains, Copilot points, WhatsApp top-ups and AI-credit packs paid this way are one-off charges. * Your plan activates as soon as the card payment is confirmed, normally within seconds; if the confirmation is delayed, reloading the subscribe page re-checks it. * The global-card rail covers plan subscriptions, paid addons, domain purchases, Copilot points packs, WhatsApp Sender top-ups and AI-credit packs. Auto-renew is on by default Unlike a Slick-Pay or BaridiMob payment, a global-card plan checkout renews itself unless you untick **Auto-renew** before paying. Stop it any time from **Card and invoices**; the plan stays active to the end of the paid period. Applying a discount code also switches auto-renew off, since a code is good for one payment. ## Discount codes The checkout sheet has a coupon field above the payment methods. Enter your code and apply it before paying — the discounted price is what the payment rail charges. * **Percentage codes** are honoured on all three rails: Slick-Pay, the global-card rail and the BaridiMob receipt rail. * **Flat-amount codes** work on the global-card rail only. * The price is always recomputed **server-side**, so a code edited in the browser will not stick. ## Payment confirmation Confirmation is automatic and there is nothing for you to configure or connect. It happens two ways. When you come back from the payment page, DZBuild asks Slick-Pay for the invoice again and activates only if Slick-Pay reports it paid. Slick-Pay also sends DZBuild a signed notification of the result, and a notification whose signature checks out activates the purchase on its own, which is what saves the payments where you closed the tab before the redirect. ## Refunds * **Local payments are final.** A CIB or Edahabia payment, like a [BaridiMob receipt](https://dzbuild.com/docs/payments/manual-receipts.md), is not refundable once the plan is credited. Choose the plan and the duration before paying, not after. A wrong or duplicate charge is corrected if you contact support within 14 days. * **Global-card payments can be refunded within 14 days** of the charge. Contact support with your payment reference inside that window; past it, the local rule applies. ## Common issues | Symptom | Cause | What to do | | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Redirected back without confirmation | 3-D Secure timed out or you closed the tab | Follow the return link again if you still have it, from any device. Otherwise reload [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) within 30 minutes in the tab you started in. If it stays pending, contact support with your reference. | | "Payment failed" on Slick-Pay's page | Most often the bank could not be reached, the payment was cancelled on the bank's page, the CVV was wrong, or the balance was short | Check the CVV and the balance, then retry. If the failure repeats with "cannot contact bank", it is the bank's side: wait a few minutes, try another card, or pay on the global-card rail. | | Payment succeeded but plan didn't activate | Confirmation delayed | Wait a minute then refresh — the page re-checks the payment and reconciles it. | | "A payment is already being processed" after double-clicking Pay | A duplicate-payment guard blocks a second checkout for 30 seconds | Not an error. Wait, and use the checkout that already opened. | ## Frequently asked **Q: Can I sell to my own customers via Slick-Pay through DZBuild?** A: Yes, on a Digital-theme store with the paid Payment Gateway addon: add the **CIB / EDAHABIA card** method at [`/dashboard/digital/payment`](https://dzbuild.com/dashboard/digital/payment) and paste the public key of your own Slick-Pay account (a **Test key** button checks it). Buyers then pay by card, the money goes to your Slick-Pay account, and the order is confirmed on its own once the payment is confirmed. DZBuild's own Slick-Pay account only takes your payments to DZBuild. Physical stores stay on [COD](https://dzbuild.com/docs/payments/cod.md). **Q: Are my card details stored?** A: No. DZBuild never sees your card number — Slick-Pay's hosted page handles it. DZBuild only stores a payment reference and the success/failure status. **Q: Which cards work, and why did mine fail?** A: This rail takes Algerian **CIB and Edahabia** cards, and no global cards. When a payment fails, the reason is usually one of four: the bank could not be reached, you cancelled on the bank's page, the CVV was wrong, or there was not enough on the card. Fix the one that applies and retry; if the bank stays unreachable, use the other rail on the same checkout sheet, **Visa / Mastercard / PayPal / Apple Pay**, billed in US dollars and, for a plan, set up as an auto-renewing subscription. **Q: I bought Enterprise by card. When does my team size apply?** A: The moment the payment activates, on both card rails and on the BaridiMob receipt alike. Enterprise comes in two sizes, 25 staff or unlimited staff, and the one you picked in the checkout sheet is applied to your store with the plan. Nothing to ask support for. --- Source: https://dzbuild.com/docs/payments/cod.md # Cash on Delivery (COD) Cash on Delivery (COD) is the dominant payment method in Algerian e-commerce. With COD, the customer pays cash directly to the courier on delivery, and the courier later remits the collected funds to your bank or CCP account. In DZBuild, COD is **the payment method on every physical store** — no payment gateway, no credentials, no integration to set up. It's the path of least friction for new merchants. Digital-theme stores never use COD COD applies to physical (non-Digital) stores. Orders on a **Digital-theme** store are always submitted as digital orders: with no payment attached, as a receipt-upload payment when the customer pays through a manual method from the paid **Payment Gateway** addon (see [Manual receipts](https://dzbuild.com/docs/payments/manual-receipts.md)), or as a card payment when the customer picks the addon's **CIB / EDAHABIA card** method, which runs on your own Slick-Pay account. ## How it works end-to-end 1. The customer places an order on your storefront. There is nothing to pick — COD is implicit: the checkout shows only a static note in the order summary (default "Payment on delivery", editable at [`/dashboard/customize`](https://dzbuild.com/dashboard/customize) → Checkout page on the Pro plan and above), and every physical-store order is recorded as Cash on Delivery. 2. The order lands in [`/dashboard/orders`](https://dzbuild.com/dashboard/orders) as `pending`. 3. You confirm the order (call-confirm or process directly) and ship it via your linked courier. 4. The courier delivers the parcel and **collects the cash** from the customer. What DZBuild declares as the collectible amount differs by provider family: * **Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua and We Can Services** receive only the **product subtotal**, together with whether shipping is free, and add their own delivery tariff on top when collecting. That subtotal is taken before any promo code, so a discount the buyer got at checkout is not taken off what these couriers collect. * **All other couriers** — the Ecotrack tenants (DHD, Conexlog, MSM Go…), the Procolis family (ZR Express, Abex Express), Maystro, NOEST and Zimou — receive the **order total including shipping**. Check the declared amount on the parcel before assuming the courier will collect your shipping fee. 5. The courier remits the collected money to you directly, on its own schedule, minus the courier's delivery fee. DZBuild is not part of that payout. 6. The order walks the status ladder: `pending → confirmed → processing → shipped → delivered`, with `returned` and `cancelled` as the failure branches. Sending an order to delivery is what sets `processing` (orders sitting in `pending` or `confirmed` are moved automatically). `shipped`, `delivered` and `returned` are then set automatically from the courier's own tracking updates — you don't set them by hand. DZBuild does not move the cash itself; the entire money leg is between you and the courier. ## Enabling / disabling COD COD cannot be turned off. On physical (non-Digital) stores every order is recorded as Cash on Delivery — there is no payment-gateway setting and no COD switch anywhere in the dashboard. What you *can* change is the wording of the payment note shown in the checkout summary: [`/dashboard/customize`](https://dzbuild.com/dashboard/customize) → **Checkout page** → **Payment method** text (default "Payment on delivery" in your storefront's language). That field requires the **Pro** plan. ## Controlling where COD is available and what the courier collects Everything that decides whether a COD order can be placed — and how much cash the courier ends up collecting — lives on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping). * **Per-wilaya Home / Desk switches.** Every wilaya row has a **Home delivery** and a **Desk delivery** toggle. Switching both OFF and saving is the only supported way to stop serving a destination: the checkout then shows a "no delivery available" message for that wilaya and the order cannot be submitted. * **Do not delete a wilaya's rate row to block it.** The checkout lists every wilaya regardless of which ones you priced, and a missing row falls back to **0 DA shipping with home AND desk delivery enabled** — you would ship those orders for free instead of blocking them. * **Wilaya mode (58 or 69).** This switches which list customers see at checkout: the historical 58 wilayas, or all 69 including the newer southern wilayas. * **Free shipping**, store-wide or **above a threshold**, reduces the cash the courier collects — the customer pays the item total only. * **Weight surcharge.** A heavy order adds to the shipping the customer pays on delivery. Rates and the two ways around it are in the next section. ## The weight surcharge This is the line merchants most often read as a DZBuild fee. It is not. Heavy parcels cost more to move, that is the courier's rule, and DZBuild applies it to the shipping figure your customer sees at checkout so the amount collected on delivery is right. * The first **5 kg of the whole order** are free. The allowance is counted once per order, not per product line: DZBuild adds up each item's weight times its quantity and charges only for what sits above 5 kg. * Every extra kilo costs **50 DA**. * It costs **100 DA** per extra kilo in the 13 deep-south wilayas (Adrar, Béchar, Tamanrasset, El Bayadh, Illizi, Tindouf, Naâma, Timimoun, Bordj Badji Mokhtar, Béni Abbès, In Salah, In Guezzam, Djanet), and only when your linked courier is Yalidine, Yalitec or Guepex. Every other courier stays at 50 DA in those wilayas too. If it does not fit the way you sell, you have two ways out, both of them in your hands: * **Leave the product weight empty.** A product with no weight, or a weight of 0, never triggers the surcharge. Weight is optional in the product editor. * **Let the order ship free.** The surcharge is only added on top of a shipping fee, so an order with no shipping fee never carries one. That covers store-wide free shipping, an order above your free-shipping threshold, a product offer that includes free shipping, and pickup from store. ## Where the cash gets collected * **Home delivery** — the courier collects at the customer's address. * **Desk delivery** — available on every store as a per-wilaya option: the customer travels to the courier's desk and pays there. Cheaper tariff and a lower return rate. The free **Stop Desk** addon lets the customer choose *which* desk. If no desk is picked, DZBuild resolves one for you on the Yalidine family (the customer's own commune first, then any desk in the wilaya) and only refuses the send when the wilaya has no desk at all; Ecotrack-family couriers simply receive the parcel with no desk id attached. * **Pickup from Store** — an addon on the **Unlimited** plan. It adds a third option at checkout, on the product page and on landing pages: the customer collects at your own pickup point, free of delivery charges, and pays you directly. Each of these changes who holds the cash, and therefore what you reconcile at payout time. ## Reducing fake orders COD is great for trust but invites bots and joke orders. Common defenses on DZBuild: * The **Captcha Protection** addon (ALTCHA Sentinel) — invisible to humans, blocks bots and headless browsers on fast checkout, full checkout and every landing-page order form. **Requires the Pro plan or higher.** It has three security levels: Normal (invisible), High (also blocks VPN / proxy / Tor visitors) and Aggressive (shows a visible challenge on submit). Customers behind very strict network blockers or corporate firewalls may not be able to complete the check. * The **Limit Orders Per IP** addon — caps successful orders from a single IP (default 3 per 12 hours). Available on **every plan, including Free**. * The **Advanced Order Management** addon — a CRM-style queue at [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced) with call-attempt tracking, a full status timeline and 12 sub-statuses (no answer, busy line, postponed, fake, duplicate, customer cancelled, waiting customer call, at courier, returned, completed…), so you work a confirmation queue instead of guessing. **Requires the Unlimited plan**, and it is not available on the Digital theme. * Filtering wilayas with high return rates if your numbers show a pattern. ## Reconciling courier payouts Each delivered COD order has: * A subtotal (the COD amount the courier collected). * A shipping fee (collected by the courier and either kept by them or passed to you, depending on your contract). * A courier delivery fee (deducted before payout). There is no CSV or Excel export button on [`/dashboard/orders`](https://dzbuild.com/dashboard/orders). To get order data out for reconciliation, use the **Google Sheets** integration ([`/dashboard/addons`](https://dzbuild.com/dashboard/addons) → Google Sheets, **Pro plan or higher**): connect a Google account, pick or create a spreadsheet, and run an export — orders, products, customers, abandoned carts, orders + carts, or all. Then reconcile that sheet against the courier's statement when payouts arrive. ## Frequently asked **Q: What happens if the customer refuses to pay on delivery?** A: The courier returns the parcel to you, and the order moves to `returned` (or `cancelled` if you mark it). You typically pay the round-trip shipping fee to the courier. When you cancel an order, or set it to `returned` yourself, DZBuild puts the stock back at once, provided the order had already reached `confirmed` or beyond, which is when the stock was reserved. When the courier's tracking moves an order to `returned`, the stock comes back once the courier reports the parcel back with you, when you click **Return received** on the order, or 15 days after the return, whichever comes first. An order cancelled while still `pending` never held stock, so nothing changes. Moving it back to `confirmed` / `processing` / `shipped` / `delivered` commits it again, so you never adjust stock by hand for a refused COD parcel. **Q: Can the customer pay partially?** A: No, COD is binary — full payment or refusal. **Q: How fast do I get paid?** A: The courier pays you directly, on its own schedule. DZBuild is not involved in that payout and cannot speed it up, so check your contract with each courier for the exact cadence. **Q: Can I combine COD with online payment?** A: Not on a physical store. Physical storefront orders are always recorded as Cash on Delivery, and there is no payment-method chooser at checkout. DZBuild's own Slick-Pay account only takes your own payments to DZBuild, such as your plan, AI credits, paid addons and domains. Customer payments before delivery exist only on **Digital-theme** stores with the paid **Payment Gateway** addon: you add your own CCP / BaridiMob / RedotPay / custom accounts, where the customer uploads a transfer receipt at checkout, and you can add a **CIB / EDAHABIA card** method on your own Slick-Pay account, where the customer pays by card and the order is confirmed on its own. **Q: Will my customers ever be able to pay by card at checkout?** A: On a Digital-theme store they already can: add the **CIB / EDAHABIA card** method in the Payment Gateway addon with your own Slick-Pay account. On physical stores card checkout is planned, with no date announced, so build on COD today. **Q: Does DZBuild take a cut of a COD order?** A: No. There is no commission on your sales at all: you pay for your plan, and the courier's delivery fee is a matter between you and the courier. See [Orders](https://dzbuild.com/docs/selling/orders.md) for the order lifecycle in detail and [Couriers overview](https://dzbuild.com/docs/couriers/overview.md) for how the cash leg ties to your linked courier. --- Source: https://dzbuild.com/docs/payments/manual-receipts.md # Manual receipts Manual receipts are how merchants pay DZBuild **without using a payment card**. You transfer the price via BaridiMob, upload the receipt in your dashboard, and our team verifies it and activates your plan, usually within 30 minutes. Manual receipts appear in two different places: 1. **Merchant → DZBuild** — paying for your own plan by BaridiMob transfer. That is what this page describes. 2. **Customer → merchant**, on Digital-theme stores only: with the paid **Payment Gateway** addon you define your own CCP / BaridiMob / RedotPay / custom accounts at [`/dashboard/digital/payment`](https://dzbuild.com/dashboard/digital/payment), and customers upload a transfer receipt at checkout for you to review before you confirm the order. Each method can carry an extra-fee percentage that is added server-side to the customer's total. The same addon can also take cards through a **CIB / EDAHABIA card** method on your own Slick-Pay account; those orders need no receipt and confirm on their own once paid. Physical stores have no receipt checkout; they use [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md). Manual receipts cover **plan upgrades and renewals only** (Pro / Unlimited / Enterprise) at [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). **AI credits, paid addons and domains can no longer be bought with a receipt**: since 21 July 2026 those are instant-card-only ([CIB / Edahabia via Slick-Pay](https://dzbuild.com/docs/payments/cib-edahabia.md) for all three, or a global Visa / Mastercard / PayPal / Apple Pay card in USD); a receipt request for them is rejected outright. ## When to use it * You don't have a CIB / Edahabia card with online payments enabled, and you don't want to use the international-card rail. * Your card was declined and you want to pay another way. * You prefer keeping a paper trail outside the card rails. ## How it works 1. Go to [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). 2. Pick the plan and duration. 3. Open the **BaridiMob** payment method on the sheet. It is the only manual option: there is no CCP tab and no generic bank-transfer option. The panel shows DZBuild's RIP with a copy button; always copy it from there, and send the total shown in the order summary above it. 4. Send the money from your BaridiMob app. 5. Capture the receipt that confirms the transfer. 6. Come back to the page and **upload the receipt**. 7. Submit. Your request goes into the queue with status `pending`. 8. Our team verifies the transfer against the destination account and activates your plan, **usually within 30 minutes**. Plan requests appear in the payment-history table at the bottom of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). It loads a moment after the page with your 4 latest rows, and **Show 10 more** loads older ones. A rejected request shows our team's reason as a note on its row. ## What to put on the receipt The receipt should clearly show: * The destination account / RIP you transferred to. * The amount sent — it must match the amount on the page exactly. * The transfer date. * A reference / transaction ID if your provider shows one. Accepted formats: **JPG, PNG, GIF, WEBP or PDF, up to 10 MB, one file per request.** Renaming a file does not help — the type is detected from the file's actual contents, and anything that is not a real image or PDF is rejected on upload. If any of these are missing, our team may ask for a fresh receipt before activating. ## What a receipt cannot do * **It cannot set its own amount.** The figure on the receipt has to match the price on the page. A transfer for less, or for a plan you did not select, is refused, and one request holds exactly one file, so two partial transfers cannot be stapled together into one payment. * **It cannot buy anything except a plan.** AI credits, paid addons and domains have been card-only since 21 July 2026, and a receipt request for them is refused on the spot. * **It cannot go through the support chat.** Receipts are read from the queue behind [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). A screenshot sent to support is not a payment request and does not join that queue; upload it on the subscribe page, which is the only place it counts. * **It cannot be reversed.** A BaridiMob payment to DZBuild is final. Check the plan and the duration before you transfer, not after. ## Discount codes A percentage discount code entered in the coupon field on the checkout sheet is honoured on the BaridiMob rail too. Apply it **before** reading the amount to transfer: the server recomputes the expected price, so a receipt for the undiscounted figure will not match. ## How long you get A receipt-paid subscription is credited as **duration × 30 days** (so 12 months = 360 days), while a card payment adds calendar months. Either way the time stacks on top of an unexpired plan, and switching to a different plan mid-term converts your remaining days by price ratio instead of discarding them. ## Common reasons a request gets rejected | Reason | Fix | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Amount doesn't match | Send the remainder and upload the receipt that shows the **total**, or contact support with both transaction references — a request holds exactly one receipt file, so two partial screenshots cannot be combined. | | Wrong destination account | The transfer didn't reach us — go back to BaridiMob and re-issue it to the RIP shown on the page. | | Receipt unreadable / cropped | Re-upload a full, sharp capture. Photos of the screen are fine if legible. | | No transaction reference visible | Re-upload a capture from your BaridiMob history that shows the transaction together with its reference. | After submitting, you cannot submit another manual request for the same store **for 30 minutes** (the cooldown applies while an earlier request is still pending or rejected). If you need to correct a receipt sooner, contact support instead of resubmitting. No email is sent when a request is approved or rejected. An approval shows as your active plan and a `completed` row in the payment history; a rejection shows our team's reason as a note on the rejected row, so check [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) yourself if activation hasn't arrived. Your money isn't lost: it's still in your BaridiMob account until you re-submit a clean receipt. ## Frequently asked **Q: How long does activation take?** A: Usually within 30 minutes. **Q: Can I get my money back?** A: No. BaridiMob receipts and CIB / Edahabia card payments are final, with no refund window, though a wrong or duplicate charge is corrected if you contact support within 14 days. Only the global-card rail can be refunded, within 14 days of the charge; see [CIB / Edahabia](https://dzbuild.com/docs/payments/cib-edahabia.md). **Q: Can I split a payment across two transfers?** A: Not in one request: a request holds exactly one receipt file. Send the full amount in a single transfer whose receipt shows the exact price. If you have already sent a partial amount, send the remainder and upload the receipt showing the **total**, or contact support with both transaction references. Remember the limit: one manual request per store every 30 minutes. **Q: Where do I see whether my receipt was approved?** A: In the payment-history table at the bottom of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe): it loads a moment after the page with your 4 latest rows (**Show 10 more** loads older ones), and shows each request's status (`pending`, `completed`, `rejected`) and timestamps. **Q: Is there a fee on manual receipts?** A: DZBuild charges no extra fee. BaridiMob may charge its own transfer fee on your side. --- Source: https://dzbuild.com/docs/plans/enterprise.md # Enterprise plan Enterprise is the **top tier** — the plan for merchants who have outgrown Unlimited, run a large team, or need custom storefront CSS and deeper analytics. It is **bought self-serve** from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) with any of the three payment methods, exactly like Pro and Unlimited. > Genuinely bespoke work — custom integrations, a contracted SLA, dedicated infrastructure — is layered on top of the plan and quoted separately. For that, contact us at [dzbuild.com/contact](https://dzbuild.com/contact). ## Pricing | Duration | 25 staff (DZD) | Unlimited staff (DZD) | | --------- | -------------- | --------------------- | | 1 month | 5,500 | 15,000 | | 3 months | 15,400 | 42,000 | | 6 months | 30,250 | 82,500 | | 12 months | 55,000 | 150,000 | Enterprise comes in two sizes. The standard size includes **25 staff seats**; the unlimited size has no seat limit. You pick the size in the checkout sheet (**25 staff** or **Unlimited**) and the price updates for the duration you chose. There is no per-seat price and no slider. Seats apply at once The seat limit you bought applies the moment the payment activates, on every payment method: global card, CIB / Edahabia and BaridiMob receipt alike. Nothing to ask support for. ## What's included | Feature | Enterprise | | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | Stores | Multiple: hard cap 50 per account; every existing store must be on an active paid plan, with a short wait between creations | | Products | Unlimited | | Orders / month | Unlimited | | Landing pages | Unlimited | | Pixels | Unlimited per platform | | **Staff seats** | **25 included**, or **unlimited** on the unlimited-staff size | | Custom storefront CSS | ✅ Enterprise-only | | Custom storefront JavaScript | ✅ Enterprise-only | | API keys for the [REST API](https://dzbuild.com/api-docs/intro.md) | ✅ Enterprise-only, created by the store owner at [`/dashboard/api`](https://dzbuild.com/dashboard/api) | | Advanced Analytics addon | ✅ Enterprise-only | | Enterprise-only theme | ✅ Promobi, on top of every theme the lower plans open | | Webhook endpoints ([Webhooks](https://dzbuild.com/docs/addons/webhooks.md) addon) | 3 per store (Unlimited gets 1) | | AI credits | Not bundled with the plan. Buy them from [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) | | Advanced [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md) connections | 30 (Free 1 · Pro 6 · Unlimited 10) | | Custom favicon | ✅ | | Custom domain | ✅ one verified custom domain per store (run several stores to run several domains) | | Multilingual storefront | ✅ | | Advanced Orders CRM | ✅ | | Priority support | ✅ named contact | Enterprise also inherits every addon that Pro and Unlimited open, and adds three Enterprise-only addons: **Advanced Analytics**, [Claude](https://dzbuild.com/docs/addons/claude.md) and [ChatGPT](https://dzbuild.com/docs/addons/chatgpt.md). ## When Enterprise makes sense * **Very high order volume.** Unlimited has no order cap of any kind, but at that scale the seat count, the deeper analytics and a contracted SLA start to matter. * **Multiple stores under one umbrella brand** with shared team, shared inventory rules, or shared courier accounts. * **A storefront that needs custom CSS** — Enterprise is the only plan where custom storefront CSS is accepted. * **Custom courier integration** — a courier we don't already support, a private API endpoint, or non-standard webhook formats. * **Custom payment integration** — a bank gateway or payment processor outside CIB / Edahabia via Slick-Pay. * **Service-level guarantees** in writing — uptime SLA, response-time SLA, named support contact. * **Dedicated infrastructure** — available as bespoke work under contract. * **Compliance requirements** — data-residency clauses, signed DPA, reseller-of-record arrangements. * **A larger team**: Enterprise includes 25 staff seats, and the unlimited-staff size has no seat limit at all; Unlimited caps at 3. ## What can be added under contract The plan itself is fixed-price. Bespoke work on top is scoped case by case, and typically covers: | Area | Typical Enterprise additions | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Quotas | Custom limits on stores, products, landing pages, Pixels | | Infrastructure | Dedicated infrastructure available as bespoke work under contract | | Couriers | Custom integrations on request; priority courier syncing | | Payments | Custom payment gateway wiring | | API | Higher API rate limits and custom webhook destinations | | Support | Named contact and a contractual response time. Support itself stays in the dashboard chat and the ticket queue; there is no phone line and no separate messaging channel | | Onboarding | Migration assistance, data import, theme tuning | | Contracts | Annual contract with custom terms, signed DPA, reseller terms if applicable | ## How to subscribe 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). 2. Pick the **Enterprise** card and the duration (1 / 3 / 6 / 12 months). 3. Pick the team size: **25 staff** or **Unlimited** (shown in the dashboard as **25 موظّفاً** / **غير محدود** and **25 employés** / **Employés illimités**). The price on the sheet updates with your choice. 4. Pay by global card (Visa, Mastercard, PayPal or Apple Pay; USD, instant, auto-renewing unless you untick the **Auto-renew** box), by [CIB / Edahabia](https://dzbuild.com/docs/payments/cib-edahabia.md) (DZD, instant), or by [manual receipt](https://dzbuild.com/docs/payments/manual-receipts.md) (BaridiMob transfer + screenshot). The seat limit applies on activation whichever method you use. 5. Enterprise features unlock immediately. For bespoke work on top of the plan, go to [dzbuild.com/contact](https://dzbuild.com/contact) and tell us your current stores, your approximate monthly orders and the custom requirements you have in mind. We scope it and send back a proposal. ## Frequently asked **Q: Can I move from Unlimited to Enterprise without disruption?** A: Yes, and it is instant — same store, same domain, same data. You pay the full Enterprise price and your unused Unlimited days carry over as bonus days at the price ratio (each remaining Unlimited day is worth 2,500/5,500 ≈ 0.45 Enterprise days). Nothing is taken offline during the switch. **Q: Is Enterprise just "Unlimited with bigger numbers"?** A: No. Beyond the seat count it adds things Unlimited does not have at all: custom storefront CSS, the Advanced Analytics addon, the Promobi theme, 30 Google Sheets connections and 3 webhook endpoints instead of 1. Bespoke work such as a new courier adapter, a new payment integration or a contractual SLA is scoped separately on top. Unlimited is the right fit if you only need the headroom. **Q: Do I need an active Pro or Unlimited plan first?** A: Not strictly. New merchants who already know they need Enterprise can start there directly. Most existing merchants graduate from Unlimited. **Q: How small can an Enterprise store be?** A: There is no floor, the plan is on sale to anyone at 5,500 DZD/month. In practice it earns its price when you need more than 3 team members, custom storefront CSS, Advanced Analytics or the Enterprise-only theme. If you only need headroom on products, landing pages and Pixels, [Unlimited](https://dzbuild.com/docs/plans/unlimited.md) is the better fit. **Q: Is there a downgrade path?** A: Yes, and it is immediate rather than end-of-term: buy Unlimited (or Pro) and the store switches the moment the payment activates, with your unused Enterprise days converted into bonus days at the price ratio (each remaining Enterprise day becomes 5,500/2,500 = 2.2 Unlimited days). Bespoke contracted work is governed by that contract. --- Source: https://dzbuild.com/docs/plans/free.md # Free plan No longer available The Free plan is **no longer offered as a standard plan** to new merchants. Your first store starts on Free only if you signed up through a DZBuild offer link for the Free plan; otherwise Free is granted **only on request, in rare cases** (typically for non-profits, students, or specific partner programs). If you're starting today, your entry point is the **3-day Pro trial**, which every new account gets automatically unless it signed up through a DZBuild offer link for the Free plan. After the trial, you subscribe to [Pro](https://dzbuild.com/docs/plans/pro.md), [Unlimited](https://dzbuild.com/docs/plans/unlimited.md), or [Enterprise](https://dzbuild.com/docs/plans/enterprise.md). All three are published plans you buy yourself from the dashboard, and none of them is quoted case by case. This page is kept for **reference only** and for stores that already had Free before the change. The Free plan, where it still exists, is the most restrictive tier — sufficient to test the platform but not to operate a real business at scale. ## What's included | Limit | Free | | ---------------------------------- | ------------------------------------------------------------------ | | Stores | 1 | | Products | **5 active** — adding a 6th is blocked | | Orders | **30 per month** | | Storefront subdomain | ✅ `your-slug.dzbuild.app` | | Custom domain | ❌ (Pro and above) | | Landing pages | 0 included; they come with a paid plan and are not sold separately | | Pixels (FB / TikTok / GA / etc.) | 0 | | Team members | 0 | | Advanced Google Sheets connections | 1 | | Custom favicon | ❌ | | Remove DZBuild branding | ❌ | | Email + community support | ✅ | ## What you still get on Free Nine addons carry no plan requirement, so a Free store can activate them from **Dashboard → Addons**: * [Stop Desk](https://dzbuild.com/docs/addons/stop-desk.md) * [Product Reviews](https://dzbuild.com/docs/addons/product-reviews.md) * [Facebook Catalog](https://dzbuild.com/docs/addons/facebook-catalog.md) * [Limit Orders per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) * Min / Max Quantity * [Stock Management](https://dzbuild.com/docs/addons/stock-management.md) * [Image Cadre](https://dzbuild.com/docs/addons/image-cadre.md) * [Offer Variant Popup](https://dzbuild.com/docs/addons/offer-variant-popup.md) * Short Links Two of them — Stop Desk and Stock Management — are unavailable on stores using the **digital** theme. ## When Free is enough * You're testing an idea — list 1-3 products, take your first orders, validate the niche. * You sell from social media (Facebook page, Instagram, TikTok) and DZBuild is just the order-taking + courier-handoff layer. * You're inside the 3-day Pro trial deciding whether to subscribe. ## When Free runs out You'll notice the limits start hurting when: * **You hit 5 products.** Adding a 6th is blocked. Products you already published above the cap are not hidden automatically — but if support moves a paid store down to Free, everything except the **5 newest** products is switched to **Draft**. Those drafted products do **not** come back by themselves when you re-subscribe: re-publish them yourself from **Dashboard → Products**. * **You hit 30 orders in a calendar month.** Your storefront then goes dark for the rest of the month — the store home page, every product page and checkout are replaced by the same **"Store currently unavailable"** page that expired stores show, so visitors cannot browse or buy. (A landing page still renders, but its order form returns a "this store reached its monthly order limit" message.) The counter resets on the 1st of the next month. * **You want to add a Facebook Pixel** — Free has 0 Pixel slots. Subscribe to Pro to unlock 1 pixel per platform. * **You want a landing page for an ad campaign.** Free includes 0 LPs, and single landing pages are no longer sold on their own. Pro includes 3. * **You want a custom domain** (`yourshop.com`) — Pro or above only. * **You want to invite a team member** — Pro = 1; Unlimited = 3; Enterprise = 25, or unlimited on its unlimited-staff size. * **You connect a custom domain and then land on Free** — a Free store cannot keep one. If a store is moved to Free while it has a verified custom domain, that domain is unlinked within about 6 hours, with no grace period; the 12-hour grace applies only to expired paid plans. When any of these become real blockers, see [Pro](https://dzbuild.com/docs/plans/pro.md), [Unlimited](https://dzbuild.com/docs/plans/unlimited.md), or [Enterprise](https://dzbuild.com/docs/plans/enterprise.md). ## What happens when a paid plan expires An expired paid plan (Pro, Unlimited, or Enterprise) is **not** run as a Free store. If you do not renew: * **Your storefront goes offline.** Anyone who visits your store — on your `your-slug.dzbuild.app` subdomain *or* your custom domain — sees a **"Store Unavailable"** page. Customers cannot browse or buy until you renew. * **Your custom domain is unlinked.** About 12 hours after expiry, any connected custom domain is disconnected. When you renew, just re-connect it from [`/dashboard/domains`](https://dzbuild.com/dashboard/domains) — it takes a minute. * **Nothing is deleted.** Your products, orders, customers, settings, landing pages, Pixels and all configuration are kept exactly as they were — your plan is never downgraded behind the scenes. * **Renew anytime and everything comes back instantly** — your storefront goes live again and all your data is exactly where you left it. (Just re-link your custom domain.) ## Tips for staying productive on Free 1. **Curate your 5 products.** Pick your top sellers; on Free, breadth doesn't matter as much as the storefront looking complete. 2. **Send your ads to a product page.** Free has no landing page and none can be bought on its own, so your best product page is the ad destination until you subscribe. 3. **Track orders informally** until you cross 30/month, then it's time to subscribe. 4. **Watch the order counter.** Hitting 30 orders takes your storefront offline for the rest of the month, so subscribe before you get close — not after. ## Frequently asked **Q: Can I stay on Free forever?** A: Yes. There's no time limit on Free — it's not a trial that expires. Just be aware of the 5-product / 30-order caps. **Q: I just signed up — am I on Free or Pro?** A: New accounts get a **3-day Pro trial** automatically, unless you signed up through a DZBuild offer link for the Free plan, which starts your first store on Free. The trial lasts 3 days, once per store, and cannot be extended or frozen. After day 3 you do **not** drop to Free: your store stays on Pro but **expired**, which means the storefront shows "Store Unavailable" to customers and your dashboard opens only the home, subscribe, settings, account, notifications, affiliate, domains and AI credits pages until you renew. Subscribe to bring it back. See [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md). **Q: My Pro plan expired and my store shows "Store Unavailable". Did you delete my data?** A: No. When a paid plan expires the storefront goes offline (customers see a "Store Unavailable" page) and the custom domain is unlinked, but nothing is deleted — your products, orders and all configuration are kept. Renew from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and your store goes live again instantly with all your data; just re-link your custom domain from [`/dashboard/domains`](https://dzbuild.com/dashboard/domains). **Q: How do I upgrade?** A: Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and pick Pro, Unlimited or Enterprise. Pay by global card (instant, auto-renewing unless you untick the box), [CIB / Edahabia](https://dzbuild.com/docs/payments/cib-edahabia.md) (instant) or [manual receipt](https://dzbuild.com/docs/payments/manual-receipts.md) (a BaridiMob transfer, approved after review, usually within 30 minutes). See [Upgrades](https://dzbuild.com/docs/plans/upgrades.md) for switching mechanics. --- Source: https://dzbuild.com/docs/plans/pro.md # Pro plan The Pro plan is where most active Algerian merchants land. It unlocks Pixel, abandoned-cart recovery, landing pages, and a custom domain — the toolkit you need the moment your store starts taking real traffic from ads or shows recurring orders. > **3-day trial:** Every new store starts on Pro for 3 days, free of charge, except the first store of an account opened through a DZBuild offer link for the Free plan, which starts on Free. After day 3, unless you subscribe, your storefront goes offline behind a **"Store Unavailable"** page until you do; no data is lost. ## Pricing Verbatim from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe): | Duration | Price (DZD) | | --------- | ----------- | | 1 month | 1,000 | | 3 months | 2,800 | | 6 months | 5,500 | | 12 months | 10,000 | Annual is the best deal: 10,000 DZD vs 12,000 DZD if billed monthly — you save the equivalent of two months. ## What's included | Feature | Pro | | ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Stores | Additional stores allowed once every store you own is paid and active (50 per account, with a short wait between creations) | | Products | 300 | | Orders / month | Unlimited | | Landing pages | 3 | | Pixels | 1 per platform across the 7 supported platforms — Facebook/Meta, TikTok, Snapchat, Pinterest, Google Analytics, Google Tag Manager, Google Ads — so up to 7 in total | | Custom head / body HTML | ✅ free-text code boxes on `/dashboard/pixels` for any tag without a native slot | | Advanced [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md) connections | 6 (Free 1 · Unlimited 10 · Enterprise 30) | | Team members | 1 | | Custom domain | ✅ | | Custom favicon | ✅ | | Abandoned-cart recovery | ✅ | | Advanced storefront customization | ✅ | | Pro theme | ✅ Started V2, on top of the Starter, Brico and Digital themes every plan opens | | Remove DZBuild branding | ❌ (Unlimited and above only) | | Priority support | ✅ | ## Pro vs Free at a glance | Feature | Free | Pro | | ---------------------------------- | ----------------------- | ---------------------------- | | Products | 5 | 300 | | Orders / month | 30 | Unlimited | | Landing pages | 0 (not sold separately) | 3 | | Pixels | 0 | 1 per platform (7 platforms) | | Advanced Google Sheets connections | 1 | 6 | | Custom domain | ❌ | ✅ | | Custom favicon | ❌ | ✅ | | Team members | 0 | 1 | | Abandoned carts | ❌ | ✅ | | Remove branding | ❌ | ❌ (Unlimited+ only) | ## Use cases that make Pro essential * You're running paid ads — you need Pixel + abandoned-cart recovery to stretch every dinar of ad spend. * You have a real catalog (more than 5 SKUs). * You want a landing page per ad campaign — A/B testing offers (Pro includes 3 LPs). * You want a custom domain (`myshop.com`) instead of `*.dzbuild.app`. * You need to invite one collaborator (Pro = 1 team member; Unlimited = 3; Enterprise = 25, or unlimited on its unlimited-staff size). ## Addons unlocked by Pro On top of the nine free-tier addons, Pro opens nine more: * [A/B Testing](https://dzbuild.com/docs/addons/ab-testing.md) * [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md) * [Custom Delivery Label](https://dzbuild.com/docs/addons/custom-delivery-label.md) * Cross-Sell * Shopify Import * [Cascading Variants](https://dzbuild.com/docs/addons/cascading-variants.md) * [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) * [Digital Product](https://dzbuild.com/docs/addons/digital-product.md) * [WhatsApp Sender](https://dzbuild.com/docs/addons/whatsapp-sender.md) Custom Delivery Label, Cross-Sell and Custom Product Shipping are unavailable on stores using the **digital** theme, and Digital Product works only on stores that use it. ## Subscribing 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). 2. Click the **Pro** card (labeled **Professionnel** / **الاحترافية** in the dashboard) and pick the duration. 3. Pick a payment method: * **Global card / PayPal / Apple Pay** — Visa, Mastercard, PayPal and Apple Pay from anywhere in the world, charged in US dollars, instant, and with the **Auto-renew** box ticked (the default) it re-charges at the end of each period until you stop it from **Card and invoices** on the same page; untick the box to pay once. * [CIB / Edahabia via Slick-Pay](https://dzbuild.com/docs/payments/cib-edahabia.md) — DZD, one-off charge, activates within \~30 seconds after 3-D Secure. * [Manual receipt](https://dzbuild.com/docs/payments/manual-receipts.md): transfer to the BaridiMob RIP shown on the page and upload the screenshot. Our team checks it and activates the plan, usually within 30 minutes. 4. All Pro features unlock immediately. > **Need a walkthrough?** Click the **▶ How to renew** button at the top of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) for an in-app guided tour. Full video tutorials are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Switching plans | Direction | Effect | | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Free → Pro | Instant; new features available immediately | | Pro → Unlimited | Instant. You pay the full Unlimited price; each unused Pro day becomes 0.4 bonus Unlimited days at the end of the new cycle | | Unlimited → Pro | Instant, not deferred. Pro limits apply as soon as the payment activates; each unused Unlimited day becomes 2.5 bonus Pro days | | Pro → Free | There is no self-serve downgrade to Free. If support moves the store to Free, everything except the 5 newest products is switched to **Draft** and you re-publish what you need yourself | See [Upgrades](https://dzbuild.com/docs/plans/upgrades.md) for the full mechanics. ## Renewals & expiration * Once you are inside the last 7 days, DZBuild emails a renewal reminder once a day until you renew, plus one WhatsApp and/or Telegram reminder at the 3-day mark if you have those channels connected. If you pay by global card with auto-renewal on, you get one email with the renewal date instead. * Renewing **before** expiry stacks: the new duration adds to the existing one with no gap. * If your Pro plan expires without renewal, **your storefront goes offline** — anyone who visits your store, on your `your-slug.dzbuild.app` subdomain *or* your custom domain, sees a **"Store Unavailable"** page, and customers cannot browse or buy. About 12 hours after expiry, any connected custom domain is unlinked. * **Nothing is deleted.** Your products, orders, customers, settings, landing pages, Pixels and all configuration are kept exactly as they were — your plan is never downgraded behind the scenes. * **Renew anytime and everything comes back instantly** — your storefront goes live again with all your data exactly where you left it. Just re-link your custom domain from **Dashboard → Domains**. ## Frequently asked **Q: What happens at the end of the 3-day Pro trial if I don't subscribe?** A: Your storefront goes offline — anyone who visits, on your `your-slug.dzbuild.app` subdomain *or* your custom domain, sees a **"Store Unavailable"** page, and any connected custom domain is unlinked about 12 hours later. Nothing is deleted: your products, orders, customers, landing pages and Pixels are all kept. Subscribe at any time and your storefront goes live again instantly with everything exactly as you left it (just re-link your custom domain from **Dashboard → Domains**). **Q: Annual or monthly?** A: Annual saves 2 months of fees but commits you for a year. Monthly is the right call until you've validated traction; switch to annual once orders are steady. **Q: Can I upgrade later to Unlimited?** A: Yes — Pro → Unlimited is instant. You pay the full Unlimited price, and your unused Pro days carry over as bonus days (0.4 Unlimited days per remaining Pro day). See [Upgrades](https://dzbuild.com/docs/plans/upgrades.md). **Q: What about Enterprise?** A: Enterprise is a published, self-serve plan at 5,500 DZD/month with 25 staff seats included (or unlimited staff from 15,000 DZD/month), plus Enterprise-only extras: custom storefront CSS, the Advanced Analytics addon and the Enterprise-only Promobi theme. AI credits are not bundled with any plan; you buy them separately from [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). Bespoke work such as custom integrations, a contracted SLA or dedicated infrastructure is quoted separately. See [Enterprise](https://dzbuild.com/docs/plans/enterprise.md). --- Source: https://dzbuild.com/docs/plans/subscriptions.md # Subscriptions DZBuild has **four plans**: Free, Pro, Unlimited, and Enterprise — all three paid plans are bought self-serve from your dashboard. New accounts get a **3-day free trial of Pro** automatically — no credit card needed — so you can build your store, list products, and even take real orders before you decide whether to subscribe. The subscription is the only thing DZBuild charges you: there is no commission on your sales, and no per-order fee. ## The four plans | Plan | Starting price | Best for | | ---------------------------------------------------------- | --------------- | ---------------------------------------------------------------------------------------------- | | [Free](https://dzbuild.com/docs/plans/free.md) | 0 DZD | Testing, low-volume sellers — 5 products, 30 orders/month, no Pixel, no LPs included | | [Pro](https://dzbuild.com/docs/plans/pro.md) | 1,000 DZD/month | Merchants running paid ads — 300 products, Pixel, 3 LPs, custom domain, custom favicon | | [Unlimited](https://dzbuild.com/docs/plans/unlimited.md) | 2,500 DZD/month | Multi-store, multilingual, CRM operations — unlimited products / LPs / Pixels, 3 team members | | [Enterprise](https://dzbuild.com/docs/plans/enterprise.md) | 5,500 DZD/month | High volume, large teams, custom CSS; 25 staff seats, or unlimited staff from 15,000 DZD/month | Free is not on sale at `/dashboard/subscribe`. A new account normally starts on the 3-day Pro trial, and the paid plans start at Pro. Free is granted only on request, in rare cases, or when you sign up through a DZBuild offer link that grants it: the first store of that account then starts on Free, with no Pro trial. See [Free](https://dzbuild.com/docs/plans/free.md). Enterprise is bought self-serve from `/dashboard/subscribe` like the other plans. Bespoke work layered on top (custom integrations, a contracted SLA, dedicated infrastructure) is still quoted separately. Detailed feature comparisons live on each plan's page. > **Naming heads-up:** The Unlimited plan is shown as **Illimité** in French and **غير محدود** in Arabic. Same plan, same price, same features — we use the **Unlimited** label across the EN docs. ## The 3-day Pro trial When you create an account at `/register`: * Your store starts on **Pro**, free, for **3 days**. * All Pro features are unlocked: 300 products, landing pages, Pixel, custom domain, abandoned-cart recovery, advanced storefront customization. * The countdown is shown in your dashboard. * At the end of the 3 days, unless you subscribe your storefront goes **offline** — visitors see a **"Store Unavailable"** page and cannot browse or buy. None of your data is touched; subscribe at any time and your storefront goes live again instantly with everything exactly as you left it. The 3 days are fixed. The trial cannot be extended, frozen or restarted, and each store gets it once. Every new store you create starts with 3 free days on Pro, including additional stores. It is per store, not once per account. (You can only create an additional store once every store you already own is on an active paid plan, so this can't be used to stay free indefinitely.) ### The subscription card At the top of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) a subscription card always tells you where you stand: the plan name with a status tag (**Free trial** during the trial), the exact expiry date and the number of days remaining. The tag turns **blue** when 7 days or fewer are left, **amber** at 3 days or fewer, and **red** once the date passes, when the card switches to an expired message. During the trial the tag stays blue and turns amber on the last day. A plan that renews itself on a global card shows an **Auto-renew** tag with its next renewal date and a **Card and invoices** link to the billing portal; otherwise the **▶ How to renew** button sits on the same card. ## Subscribing 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). 2. Pick a plan (Pro, Unlimited or Enterprise). When you pick Enterprise, the checkout sheet also asks for the team size: **25 staff** or **Unlimited**. See [Enterprise](https://dzbuild.com/docs/plans/enterprise.md). 3. Pick a duration (1 / 3 / 6 / 12 months). Annual saves the equivalent of two months on both Pro (10,000 vs 12,000 DZD) and Unlimited (25,000 vs 30,000 DZD). 4. **Have a discount code?** Type it in the checkout sheet and press **Apply** before choosing a payment method. Percentage codes are honoured on all three payment rails — the server re-validates the code and recomputes the price. Flat-amount codes only work on the international-card rail, and the sheet tells you so. 5. Pick a payment method — three rails are available: * **Global card / PayPal / Apple Pay**: we accept Visa, Mastercard, PayPal and Apple Pay from **anywhere in the world**. Charged in **US dollars** on a secure payment page, activation is instant. The **Auto-renew** box is ticked by default: the card is charged again at the end of each period, and you can stop that at any time from **Card and invoices** on this page. Untick the box to pay once for the duration you chose. Use it if you don't hold an Algerian CIB or Edahabia card. * **CIB / Edahabia via Slick-Pay** — charged in DZD as a one-off payment. You don't need a Slick-Pay account of your own to pay for a plan. Activation is automatic within \~30 seconds after 3-D Secure. * **BaridiMob manual receipt**: transfer the amount to the DZBuild BaridiMob RIP shown on the page (`00799999002871122994`), then upload the receipt screenshot. Our team verifies and activates it, usually within 30 minutes. 6. Once activated, all features unlock immediately. > **Need a walkthrough?** Click the **▶ How to renew** button at the top of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) for an in-app guided tour. Full video tutorials are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Renewals * Renewal is **manual** on the CIB / Edahabia (Slick-Pay) and BaridiMob rails: come back and pay before expiry. A global-card payment with **Auto-renew** ticked re-charges at the end of each period and extends your expiry date; with the box unticked it is a one-off like the local rails. If you add time on another rail in between, the next card charge is pushed back to the day before your new expiry date. * Renewing **before** expiry stacks: the new duration is added to the existing one with no gap. * Renewing **after** expiry restarts the plan from the day of payment. ### Reminders Once your paid plan is inside its last **7 days**, DZBuild emails a renewal reminder **once a day** until you renew. A plan that renews itself on a global card gets one email per cycle with its renewal date instead, and gets the daily email again if that card charge is declined. When expiry is **3 days** away you also get one WhatsApp reminder on the phone number of your account and, if you connected the Telegram bot, one Telegram reminder (once per expiry cycle, skipped for plans that renew on a card). After expiry you get one email saying the store is unavailable, plus a "store paused" WhatsApp message. Stores still on the free 3-day Pro trial get no reminder before the end, only a notice once the trial is over, so watch the countdown on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). ### Stopping auto-renewal If your plan renews on a global card, the subscription card on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) shows a **Card and invoices** link (**بطاقة الدفع والفواتير** / **Carte et factures**). It opens the billing portal, where you stop the renewal, change the card or download your receipts. Stopping it ends future charges; your plan stays active until the period you already paid for ends, and the card then shows that date. ## Payment history At the bottom of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) you get the full history of your subscription payments: plan, duration, amount, payment method and status (**pending**, **completed**, **rejected** with our reason on a rejected receipt, **failed**, **cancelled** or **refunded**). A card payment you started but did not finish shows as **unpaid** with a **Continue payment** button until its invoice expires, then as **expired invoice**. The first 4 rows load with the page, then 10 at a time; press **Show 10 more** to append older batches. The invoice PDF link lives on the same rows. While a manual receipt is waiting for review, a **"receipt under review"** banner is shown on the page. ## Plan switching transitions | Direction | Effect | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Free → Pro | Instant; new features available immediately | | Free → Unlimited | Instant; new features available immediately | | Pro → Unlimited | Instant. You pay the **full** Unlimited price; your unused Pro time is converted into bonus days on Unlimited at the price ratio — each remaining Pro day is worth 1,000/2,500 = 0.4 Unlimited days, added to the end of the new cycle | | Unlimited → Pro | Instant, not deferred. The moment the Pro payment activates the store drops to Pro limits, and the unused Unlimited time becomes bonus Pro days at the price ratio (each remaining Unlimited day becomes 2,500/1,000 = 2.5 Pro days). To keep Unlimited features to the end of your cycle, wait for it to expire before buying Pro | | Pro not renewed | Storefront becomes **Unavailable** (both the dzbuild.app subdomain and any custom domain); custom domain unlinked \~12 h after expiry; all data kept; renew to restore | | Unlimited not renewed | Storefront becomes **Unavailable** (both the dzbuild.app subdomain and any custom domain); custom domain unlinked \~12 h after expiry; all data kept; renew to restore | | Any → Enterprise | Instant, like any other upgrade: pick Enterprise on `/dashboard/subscribe`, choose the team size (25 staff or unlimited) and the duration, and pay. The seat limit applies the moment the payment activates, on every payment method | See [Upgrades](https://dzbuild.com/docs/plans/upgrades.md) for the detailed mechanics, including the bonus-day math. ## What happens if you do not renew If your paid plan (Pro, Unlimited, or Enterprise) expires and you do not renew: * **Your storefront goes offline.** Anyone who visits your store — on your `your-slug.dzbuild.app` subdomain *or* your custom domain — sees a **"Store Unavailable"** page. Customers cannot browse or buy until you renew. * **Your dashboard keeps working, but only in part.** You still reach the dashboard home, Subscribe and its payment history, invoice downloads, Settings, Account, Notifications, the Affiliate page, AI credits and the Domains page. Every other dashboard page (products, orders, customers, landing pages, addons) sends you back to the subscribe page until the plan is active again. * **Your custom domain is unlinked.** About 12 hours after expiry, any connected custom domain is disconnected. When you renew, just re-connect it from **Dashboard → Domains** — it takes a minute. * **Nothing is deleted.** Your products, orders, customers, settings, landing pages, Pixels and all configuration are kept exactly as they were — your plan is never downgraded behind the scenes. * **Renew anytime and everything comes back instantly** — your storefront goes live again and all your data is exactly where you left it. (Just re-link your custom domain.) An expired store is kept as it is, however long it stays unrenewed. If you want the account itself removed, open a support ticket and attach a screenshot of your account settings page in the app showing the email (and the phone number, if you set one) linked to the account. Once our team confirms it, the account is deleted in full after 30 days. ## Multiple stores Multi-store works on **any paid plan**: Pro, Unlimited or Enterprise. To create an additional store, every store you already own must be on an active, unexpired paid plan. Each store carries its own plan and expiry date but shares your single billing identity, and orders, products and customers stay scoped per store. See [Multi-store](https://dzbuild.com/docs/operations/multi-store.md). ## Frequently asked **Q: Can I get an invoice?** A: Yes. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), scroll to the payment history at the bottom, and click the PDF icon on the payment you want. The link appears only once the payment is completed and its invoice has been generated. **Q: Can I pay annually for one store and monthly for another?** A: Yes, on any paid plan where you can hold more than one store. Each store carries its own plan and expiry date, so durations can differ per store. **Q: What if my receipt is rejected?** A: You will **not** receive an email. Check the payment history at the bottom of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe): the request shows a **Rejected** status with the reason if one was given. Re-upload a clearer receipt from the same page, or press the chat button in the help box there to reach us. **Q: Refund policy?** A: It depends on how you paid. Payments made with a **global card** can be refunded in full within **14 days** of the payment, no reason required: email your request to . Payments made on the local rails, CIB / Edahabia and BaridiMob, are **final**: they cannot be refunded once the plan is activated. Bespoke Enterprise work under contract is governed by that contract. **Q: Can I move the time left on one store to another store?** A: Yes, on request. Open a support ticket with your account email and the links of both stores, and our team moves the remaining paid period across. **Q: Can I turn a plan I paid for into AI credits?** A: No. Plans and AI credits are separate purchases, and neither converts into the other. Credits are bought from [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). **Q: I see "Unlimited" / "Illimité" / "غير محدود" — is that Unlimited?** A: Yes. Same plan. The dashboard shows it as "غير محدود" in Arabic and "Illimité" in French, and we use **Unlimited** as the display name in EN docs. --- Source: https://dzbuild.com/docs/plans/unlimited.md # Unlimited plan Unlimited is for stores that have outgrown Pro's caps: unlimited products, unlimited landing pages, unlimited Pixels per platform, multilingual storefront, Advanced Orders CRM, webhooks, DZBuild branding removed, and a real team — up to 3 members. > In your dashboard, Unlimited is labeled **Illimité** in French and **غير محدود** in Arabic. Same plan in all three languages. ## Pricing Verbatim from [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe): | Duration | Price (DZD) | | --------- | ----------- | | 1 month | 2,500 | | 3 months | 7,000 | | 6 months | 13,500 | | 12 months | 25,000 | Annual saves the equivalent of two months — 25,000 DZD vs 30,000 DZD if billed monthly. ## What's included | Feature | Unlimited | | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | | Stores | Multiple: hard cap 50 per account; every existing store must be on an active paid plan, and there is a short wait between creations | | Products | Unlimited | | Orders / month | Unlimited | | Landing pages | Unlimited | | Pixels (Meta / TikTok / Snapchat / Pinterest / GA / GTM / Google Ads) | Unlimited per platform | | Advanced [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md) connections | 10 (Free 1 · Pro 6 · Enterprise 30) | | Team members | 3 | | Monthly AI credits | ❌ none; no plan includes AI credits, so buy them separately from [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits) | | Custom domain | ✅ (one per store) | | Custom favicon | ✅ (also on Pro) | | Multilingual storefront addon (`multi-language`) | ✅ | | Advanced Orders CRM addon (`advanced-orders`) | ✅ | | Webhooks addon (n8n / Make / Zapier) | ✅ 1 endpoint (Enterprise: 3) | | Pickup from Store addon | ✅ | | Unlimited-plan themes | ✅ Bloom and Prestige, on top of every theme Pro opens | | Bulk import | 5,000 rows per file (same on every plan); no product-count ceiling on Unlimited | | Remove DZBuild branding | ✅ | | Priority support | ✅ | ## Unlimited vs Pro at a glance | Feature | Pro | Unlimited | | ------------------------------ | --------------------------------------------------- | ------------------------------------- | | Stores | Multi-store (available on Pro too — 50 per account) | Multi-store (same 50-per-account cap) | | Products | 300 | Unlimited | | Landing pages | 3 | Unlimited | | Pixels | 1 per platform | Unlimited per platform | | Google Sheets connections | 6 | 10 | | Team members | 1 | 3 | | Multilingual storefront | ❌ | ✅ | | Advanced Orders CRM | ❌ | ✅ | | Webhooks (n8n / Make / Zapier) | ❌ | ✅ | | Pickup from Store | ❌ | ✅ | ## Landing pages and the AI generator Unlimited removes Pro's 3-page cap: build as many landing pages as you want from [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages), at no extra cost. The **AI landing page generator** is not part of that. It spends AI credits, and Unlimited carries no monthly credit grant, so generating a page with it means buying credits first from [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). Building the same page by hand in the landing page editor costs no credits. ## Use cases that make Unlimited essential * You run **more than one store** — different brands, different niches, multiple wilayas — under one account. * You want a **multilingual storefront** (Arabic + French) with a customer-facing language selector. The `multi-language` addon is gated to Unlimited. * You need the **Advanced Orders CRM**: 12 sub-statuses (no answer, busy line, postponed, fake, duplicate, at courier, returned, completed…) and a full call-attempt timeline per order. This is the `advanced-orders` addon, also Unlimited gated. It is **not available on stores using the digital theme** — the same restriction applies to `pickup-from-store`, the other Unlimited-gated addon of that kind. * You want **Webhooks** to push order and store events straight into n8n, Make or Zapier. The `webhooks` addon is Unlimited gated, and Unlimited runs **one** endpoint (Enterprise runs three). * You have a **team** of 3 — Pro caps at 1 invitee, Unlimited supports 3, Enterprise gives 25, or unlimited staff on its unlimited size. * You want every detail of the storefront branded as yours: **all DZBuild markings off** (removing the branding is Unlimited and above; the custom favicon is already available on Pro). ## Subscribing 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). 2. Click the **Unlimited** card (labeled **Illimité** / **غير محدود** in the dashboard) and pick the duration. 3. Pick a payment method: * **Global card / PayPal / Apple Pay**: Visa, Mastercard, PayPal and Apple Pay from anywhere in the world, instant, and with the **Auto-renew** box ticked (the default) it re-charges at the end of each period until you stop it from **Card and invoices** on the same page; untick the box to pay once. Checkout shows the final amount in US dollars before you pay, and card processing costs are already included in it. * [CIB / Edahabia via Slick-Pay](https://dzbuild.com/docs/payments/cib-edahabia.md): DZD, one-off charge, activates within \~30 seconds after 3-D Secure. * [Manual receipt](https://dzbuild.com/docs/payments/manual-receipts.md): transfer to the BaridiMob RIP shown on the page and upload the screenshot. Approval usually lands within 30 minutes. 4. All Unlimited features unlock immediately. > **Need help?** The "▶ How to renew" tutorial inside [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) walks you through the whole flow with on-page hints. Video walkthroughs are also on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Switching plans | Direction | Effect | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Pro → Unlimited | Instant. You pay the full Unlimited price; each unused Pro day becomes 0.4 bonus Unlimited days at the end of the new cycle | | Unlimited → Pro | Instant, not deferred. Pro limits apply as soon as the payment activates; each unused Unlimited day becomes 2.5 bonus Pro days. Wait for expiry if you want Unlimited features to the end of the cycle | | Free → Unlimited | Instant; new features available immediately | | Unlimited → not renewed (expires) | At expiry the storefront becomes **Unavailable** (subdomain *and* custom domain); the custom domain is unlinked \~12 h later; all data is kept; renew to restore instantly | See [Upgrades](https://dzbuild.com/docs/plans/upgrades.md) for the full mechanics. ## Renewals & expiration * Once you are inside the last 7 days, DZBuild emails a renewal reminder once a day until you renew, plus one WhatsApp and/or Telegram reminder at the 3-day mark if you have those channels connected. If you pay by global card with auto-renewal on, you get one email with the renewal date instead. * Renewing **before** expiry stacks: the new duration adds onto the existing one with no service gap. * At expiration without renewal, **your storefront goes offline**: anyone visiting your `your-slug.dzbuild.app` subdomain *or* your custom domain sees a **"Store Unavailable"** page and cannot browse or buy. Your dashboard still opens, but only the home, subscribe, settings, account, notifications, affiliate, domains and AI credits pages work until you renew. About 12 hours after expiry, any connected custom domain is unlinked, so re-connect it from [`/dashboard/domains`](https://dzbuild.com/dashboard/domains) once your plan is active again. * **Nothing is deleted.** Your products, orders, customers, settings, landing pages, Pixels and all configuration are kept exactly as they were — your plan is never downgraded behind the scenes. * **Renew anytime and everything comes back instantly** — your storefront goes live again and all your data is exactly where you left it. (Just re-link your custom domain.) Long inactivity If an account stays unrenewed for **12 consecutive months**, DZBuild reserves the right to close it. This is not automatic, but please renew — or export your data — if you intend to keep the account. ## Frequently asked **Q: Can I run different domains for different stores?** A: Yes. Each store under your account can carry its own custom domain (one verified domain per store). See [Custom domain](https://dzbuild.com/docs/customizing/custom-domain.md). **Q: Are the multi-language and Advanced Orders addons included or extra?** A: Included — the four Unlimited-gated addons (Multi-Language Store, Advanced Order Management, Webhooks, Pickup from Store) unlock automatically the moment your Unlimited subscription is active. No separate addon purchase. See the [Addons overview](https://dzbuild.com/docs/addons/overview.md). **Q: Does Unlimited include AI credits?** A: No. No plan includes AI credits, Enterprise included. On Unlimited you buy credits when you need them from [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits); see [AI credits](https://dzbuild.com/docs/advanced/ai-credits.md). **Q: How do I move data between my stores?** A: Bulk product **import** at [`/dashboard/products/bulk-import`](https://dzbuild.com/dashboard/products/bulk-import) works per store, and that page imports only. To get products *out* of a store, use the [Google Sheets addon](https://dzbuild.com/docs/operations/google-sheets.md), which exports your products to a sheet you can reshape for the other store's import. Customer and order data stays scoped per store by design (see [Multi-store](https://dzbuild.com/docs/operations/multi-store.md)). **Q: Heavier than Unlimited?** A: See [Enterprise](https://dzbuild.com/docs/plans/enterprise.md): 25 to 200 staff seats, custom storefront CSS, Advanced Analytics, and bespoke work (custom integrations, SLA, dedicated infrastructure) under contract. --- Source: https://dzbuild.com/docs/plans/upgrades.md # Upgrades & downgrades This page covers how to move between plans on DZBuild. The four plans are [Free](https://dzbuild.com/docs/plans/free.md), [Pro](https://dzbuild.com/docs/plans/pro.md), [Unlimited](https://dzbuild.com/docs/plans/unlimited.md), and [Enterprise](https://dzbuild.com/docs/plans/enterprise.md) — all three paid plans are bought self-serve. New accounts start on a 3-day Pro trial — see [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md). ## Switching matrix | Direction | Effect | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Free → Pro | Instant; new features available immediately | | Free → Unlimited | Instant; new features available immediately | | Pro → Unlimited | Instant. You pay the full Unlimited price; each unused Pro day becomes 0.4 bonus Unlimited days | | Unlimited → Pro | Instant, not deferred. Pro limits apply as soon as the payment activates; each unused Unlimited day becomes 2.5 bonus Pro days | | Pro, not renewed | The plan **expires** at end of cycle — your storefront goes **Unavailable** and the custom domain is unlinked. Nothing is deleted; renew to restore | | Unlimited, not renewed | Same as above — on expiry the storefront goes **Unavailable** (it is *not* run as a Free plan); data kept, renew to restore | | Any → Enterprise | Instant, like any other upgrade: pick Enterprise on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), choose the team size (25 staff or unlimited) and the duration, and pay. The seat limit applies the moment the payment activates, on every payment method | | Enterprise → Pro / Unlimited | Instant on activation of the lower plan; unused Enterprise days carry over as bonus days at the price ratio | ## How to upgrade 1. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe). 2. Click the button on the plan card you want: **Upgrade to Pro**, **Upgrade to Unlimited** or **Upgrade to Enterprise** (in the dashboard **Passer au Professionnel** / **ترقية للاحترافية**, **Passer à l'Illimité** / **ترقية لغير محدود** and **Passer à Entreprise** / **الترقية إلى المؤسسات**). For Enterprise, pick the team size (**25 staff** or **Unlimited**) in the checkout sheet that opens. 3. Pick the duration: 1 / 3 / 6 / 12 months. Longer = cheaper per month. 4. **Using a promo code?** Type it in the checkout sheet and press **Apply** before picking a payment method. Percentage codes work on all three payment rails — the server re-validates the code and recomputes the price. Flat-amount codes only work on the international-card rail, and the sheet tells you so. 5. Pick a payment method: * **Global card / PayPal / Apple Pay**: Visa, Mastercard, PayPal and Apple Pay from anywhere in the world, charged in US dollars on a secure payment page, instant. The **Auto-renew** box is ticked by default, so the card is charged again at the end of each period; untick it to pay once for the duration you chose. * [CIB / Edahabia via Slick-Pay](https://dzbuild.com/docs/payments/cib-edahabia.md) — instant. Plan activates within \~30 seconds after 3-D Secure. * [Manual receipt](https://dzbuild.com/docs/payments/manual-receipts.md): transfer to the BaridiMob RIP shown on the page, then upload the screenshot. Our team checks it and activates the plan, usually within 30 minutes. 6. The new plan applies immediately on activation. All features unlock right away. Enterprise seats apply at once Whichever payment method you use, the team size you bought (25 staff or unlimited) applies to your store the moment the payment activates. Nothing to ask support for. ## How to renew Renewal is the same flow as upgrading — [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) → pick your current plan → pick a duration → pay. The CIB / Edahabia and BaridiMob rails do **not** auto-charge, so on those you must come back and renew manually. A global-card payment made with the **Auto-renew** box ticked (the default) **re-charges at the end of each period** and extends your expiry until you stop it: open **Card and invoices** on the subscription card of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe), which opens the billing portal where you stop the renewal, change the card or download receipts. A card payment made with the box unticked is a one-off, like the local rails. > **Built-in walkthrough:** click the **▶ How to renew** button at the top of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) (Arabic: **كيف أجدد؟** · French: **Comment renouveler ?**) for a 5-step in-app guided tour with on-screen tooltips: the welcome, plan choice, the floating subscribe button, duration and payment method, plus a "need help" step. There is no currency choice — everything is priced in DZD; the international-card rail converts to USD at checkout. The tour runs without leaving the page. > > **Video tutorials** are on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ### Renewing without a gap * Paying **before** expiry **adds** the new duration to the existing one — no gap. * For Slick-Pay, this happens within seconds of the 3-D Secure check. * Manual receipts are usually approved within 30 minutes. Pay a day before expiry to be safe. ### Renewing after expiry * The plan restarts from the day of payment. * Your storefront goes live again immediately on activation — all your data (products, orders, Pixels, landing pages, settings) is exactly as you left it. * Re-link your custom domain from **Dashboard → Domains**; HTTPS is re-issued automatically. ## How your remaining days are settled Every purchase settles the time already on the store: * **Same plan.** The months you buy are added to your current expiry date. Nothing is lost and there is no gap. * **A different plan with days left.** You pay the new plan's full price, and your unused days are converted into days of the new plan by the price ratio: `remaining days × old monthly price ÷ new monthly price`. The result is added on top of the months you just bought. * **An expired plan.** Nothing is left to convert, so the new cycle starts on the day the payment activates. What carries over is time, never money, and no refund is issued for the days you leave behind. Since the conversion follows the price, moving up buys fewer days than you had and moving down buys more. With 17 days left: * Unlimited to Enterprise: 17 × 2,500 ÷ 5,500 is about **7.7 Enterprise days** added to the new cycle. * Enterprise to Unlimited: 17 × 5,500 ÷ 2,500 is about **37 Unlimited days**. ## Pro → Unlimited mid-cycle (bonus days, not a money credit) You pay the **full** Unlimited price. What carries over is **time, not money**: each unused Pro day is converted into 1,000/2,500 = **0.4 Unlimited days** and added to the end of your new cycle. Example: * You're 10 days into a 30-day Pro cycle, so 20 days are left. * You buy 1 month of Unlimited for 2,500 DZD — the full price, no discount. * You get 1 month **plus 8 bonus days** (20 × 0.4). The same rule runs on all three payment rails, and it works identically for downgrades (each unused Unlimited day becomes 2,500/1,000 = 2.5 Pro days). ## Downgrades — immediate, not end of cycle Downgrades take effect **immediately** when the lower plan's payment activates; DZBuild does not defer them to the end of the cycle. On an Unlimited or Enterprise store the lower plan cards show **Included in your plan** (**Inclus dans votre plan** / **متضمنة في خطتك**) instead of a button, so tap the floating subscribe button at the bottom of the screen on [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and pick the lower plan at the top of the checkout sheet. * **Unlimited → Pro**: the store drops to Pro limits the moment the payment activates, and your unused time is converted into bonus Pro days at the price ratio (each unused Unlimited day becomes 2.5 Pro days). If you want to keep Unlimited features to the end of your cycle, wait for it to expire before buying Pro. * **Existing products and Pixels above the new plan's caps are NOT hidden or deleted.** You simply cannot create new ones until you are back under the cap. * **There is no automatic drop to Free.** If you simply stop paying, your paid plan does not quietly become a Free plan — it **expires**, and your storefront goes **Unavailable** until you renew (details in [What happens at expiration](#what-happens-at-expiration)). Your data is kept; nothing is deleted. ## Pricing recap | Plan | 1 mo | 3 mo | 6 mo | 12 mo | | ---------- | --------- | ---------- | ---------- | ---------- | | Free | 0 | 0 | 0 | 0 | | Pro | 1,000 DZD | 2,800 DZD | 5,500 DZD | 10,000 DZD | | Unlimited | 2,500 DZD | 7,000 DZD | 13,500 DZD | 25,000 DZD | | Enterprise | 5,500 DZD | 15,400 DZD | 30,250 DZD | 55,000 DZD | Enterprise comes in two sizes: 25 staff at the prices above, or unlimited staff at 15,000 / 42,000 / 82,500 / 150,000 DZD for 1 / 3 / 6 / 12 months. Paying by **global card** charges you in **US dollars**, and a conversion fee applies, so the amount sits slightly above a straight conversion of the DZD price. The exact USD figure is shown on the payment tile before you confirm. The CIB / Edahabia and BaridiMob rails charge the exact DZD price above. See [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md) for the full feature matrix per plan. ## What happens at expiration * Every day during the last **7 days** before expiry, DZBuild emails a renewal reminder, and at the 3-day mark it sends one WhatsApp reminder to the phone number of your account, plus one Telegram reminder if you connected the Telegram bot. A plan that renews itself on a global card gets one email per cycle with its renewal date instead, and no WhatsApp or Telegram reminder. Stores still on the free 3-day Pro trial get no reminder email. * **Your storefront goes offline.** If your paid plan (Pro, Unlimited, or Enterprise) expires and you don't renew, anyone who visits your store — on your `your-slug.dzbuild.app` subdomain *or* your custom domain — sees a **"Store Unavailable"** page. Customers cannot browse or buy until you renew. * **Your custom domain is unlinked.** About 12 hours after expiry, any connected custom domain is disconnected. When you renew, just re-connect it from **Dashboard → Domains**. It takes a minute. * **Nothing is deleted.** Your products, orders, customers, settings, landing pages, Pixels and all configuration are kept exactly as they were — your plan is never downgraded behind the scenes. * **Renew anytime and everything comes back instantly** — your storefront goes live again and all your data is exactly where you left it. (Just re-link your custom domain.) An expired store is kept as it is, for as long as it stays unrenewed. Account deletion happens only if you ask for it: see [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md). ## Frequently asked **Q: I just paid but the dashboard still shows my old plan.** A: For Slick-Pay, allow \~30 seconds for the payment to be confirmed, then refresh. Manual receipts are usually approved within 30 minutes. The payment history at the bottom of [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) shows the current status. **Q: Can I prepay 24 months at once?** A: There is no 24-month option in the picker, but you can buy 12 months twice back-to-back — a same-plan payment made before expiry stacks on top of your current end date, so you end up with 24 months and no gap. **Q: My Slick-Pay payment was declined — will I be charged?** A: No. A declined payment doesn't capture the funds. Try another card or use a [manual receipt](https://dzbuild.com/docs/payments/manual-receipts.md). **Q: Will my custom domain stay attached if my plan expires?** A: No. About 12 hours after expiry your custom domain is **unlinked**, and your whole storefront — both the custom domain *and* the `your-slug.dzbuild.app` subdomain — shows a **"Store Unavailable"** page until you renew. When you renew, re-connect the domain from **Dashboard → Domains**; it reconnects in about a minute and HTTPS is re-issued automatically. No data is lost. **Q: Can I move my products from one store to another?** A: Bulk import at [`/dashboard/products/bulk-import`](https://dzbuild.com/dashboard/products/bulk-import) works per store, 5,000 rows per file. That page only imports; to get products out of a store, use the product export in the [Google Sheets](https://dzbuild.com/docs/operations/google-sheets.md) integration, then import the file into the other store. Multi-store runs on any paid plan, each store with its own catalog. --- Source: https://dzbuild.com/docs/selling/abandoned-carts.md # Abandoned carts A couple of seconds after a customer leaves the phone field at checkout, DZBuild captures a "draft order". If they complete, the cart is marked recovered and linked to the order it produced. If they don't, it stays here as an **abandoned cart**, and most of these are recoverable with a phone call. Paid feature — Pro plan or higher The abandoned-carts dashboard is a **paid feature** available on the **Pro**, **Unlimited**, and **Enterprise** plans. On the **Free** plan carts are still captured in the background, but the list is masked server-side (name, phone, wilaya, commune and product names show as ●●●●●●) **and** the three actions that matter are blocked outright: you cannot open a cart's detail, mark it contacted, or convert it to an order. Deleting is not offered either: each row shows only a lock that opens the upgrade prompt. Open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and click **▶ How to renew** for the in-app tour, or watch the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off) tutorials. ## Video [Abandoned carts — recover lost orders in DZBuild](https://www.youtube.com/embed/WQFJGoxoEoQ) ## What gets captured On the shared storefront checkout and the digital-theme checkout, a cart is captured 2 seconds after the customer leaves the **phone** field, with a page-close beacon as a fallback. Wilaya, commune, name and email are stored only if they happened to be filled at that moment: none of them is required, and the page-close fallback sends no wilaya at all. **Landing pages and the Fast Checkout form on product pages capture earlier.** There the phone field is watched as it is typed, not only when the visitor leaves it, so someone who types a number and then abandons the form still produces a cart. Expect a landing page to report more abandoned carts than a checkout page for the same traffic, and read its abandonment rate against itself over time rather than against your storefront's. The row holds: * Phone, and wilaya / commune / name / email when they were filled. * Items in cart (with variants, quantities and prices). * The **items subtotal only** — see the warning below. * Timestamp of capture. Capture runs on five surfaces: the shared storefront checkout, the digital-theme checkout, the Fast Checkout form on product pages, landing pages, and digital product pages. Some visits are deliberately never captured — a phone that has just ordered from you, and repeated captures from the same visitor that look automated rather than human. If the customer completes checkout, the cart's status flips to `recovered`, it keeps a link to the order it produced, and it leaves the list: no tab shows recovered carts, because the sale now lives in [Orders](https://dzbuild.com/docs/selling/orders.md). It still counts in your recovery rate. Any older open cart from the same phone number is cleaned up at that moment, so you are not left calling a stale duplicate. The cart total does not include shipping The total stored on an abandoned cart is the **items subtotal only** — no shipping is calculated or stored at capture time, so it is not the number the customer saw at checkout. Quote it on a recovery call and you under-quote by the whole shipping amount. Shipping appears for the first time when you open the Convert-to-order dialog: it is looked up live from your current per-wilaya shipping rates (including your free-shipping and free-shipping-threshold rules) and recomputed server-side when the order is created, so the client's number is never trusted. If you changed your rates since the cart was captured, the new rate is what applies. ## The abandoned-carts page Open **Dashboard → Abandoned carts** at [`/dashboard/abandoned-carts`](https://dzbuild.com/dashboard/abandoned-carts). You'll see: * A header strip with your total carts, today's and this week's counts, and your **Recovery** rate. * Three stat cards: **Abandoned carts** (with today's count), **Contacted** (with the percentage of the pipeline contacted), and **Abandoned-cart value**: the total DZD in carts still marked Abandoned, plus this week's cart count. * A filter strip: **Abandoned | Contacted | All**, each with a count badge. The page opens on **Abandoned**, and **All** leaves out recovered carts. * A table of carts with phone, wilaya, items summary, total, status, captured-at, and per-row actions. Every row carries four actions: **View details**, **Convert to order**, **Mark contacted** and **Delete**. On the Free plan none of them render: the row shows a single lock that opens the upgrade prompt. The status flow: ``` abandoned → contacted → recovered ``` * **Abandoned** — captured but no follow-up yet. * **Contacted** — you've tried to reach the customer. Marks the cart as touched. * **Recovered**: the customer completed the purchase, either by your follow-up or on their own. The cart leaves the list, the sale is in [Orders](https://dzbuild.com/docs/selling/orders.md), and it counts in your recovery rate. Carts are kept for **60 days** after their last activity and then removed automatically; the page header shows the same retention line. Delete stale ones yourself if you want the tab clean before that. ## Recovery channels ### 1. Call The fastest channel, and the one Algerian merchants lean on. Click the eye icon on the cart row to open the detail, then tap the phone number: it opens your dialer on mobile. After the call, mark the cart as **Contacted**. If the customer says "yes I'll order now", you can convert the cart directly to an order from the cart detail (or wait for them to complete checkout themselves). ### 2. SMS There is **no per-cart recovery link** — DZBuild does not generate one. If you SMS the customer, send them your storefront or landing-page URL and they will have to re-enter their details, or take the order over the phone and create it yourself with **Convert to order**. ### 3. Email reminder If the customer entered an email, send a recovery reminder. Algerian buyers respond less to email than SMS or calls — usually keep email as a third tier. ### 4. Pixel retargeting `InitiateCheckout` fires when a visitor reaches the **checkout page** (the shared storefront checkout and the digital-theme checkout) and when a visitor sends the Fast Checkout form on a product page or an order form on a landing page. It never fires when a cart is captured, so a visitor who types a phone number on a product page or landing page and leaves without sending the form leaves a cart but no `InitiateCheckout`. Digital product pages fire none. Build your retargeting audience on the checkout page's `InitiateCheckout` event and treat it as roughly, not exactly, the abandoned-cart population. ## Marking as contacted When you reach out (any channel), click **Mark as contacted** on the cart row. This: * Updates the status to `contacted`. * Records a timestamp on the cart's timeline. * Moves the cart out of the **Abandoned** tab and into **Contacted**, so your team doesn't double-touch it. ## Converting a cart to an order For carts where the customer agreed by phone but didn't go back to the website, you can convert the cart to an order directly: 1. Click the bag-plus icon on the cart row (or open the cart and click **Convert**) — you don't have to open the detail first. 2. In the dialog, check the name, phone, email, wilaya, commune and address, pick home or desk delivery, and review or adjust the items. You can change quantities and pick variants right there. Shipping is fetched live from your rates and the total updates as you change the wilaya. 3. Click **Create order**. The order is always created as **Cash on Delivery** with status `pending` — there is no payment-method choice. Shipping is recomputed server-side at creation, so the dialog's shipping is authoritative only if your rates haven't changed in between. Item prices and quantities are saved exactly as they stand in the dialog, where you can also edit a price, so check them before you click **Create order**. The cart status flips to `recovered`. Bundle lines are priced flat Offer / bundle lines are priced as a flat bundle total, not price × quantity — in both the captured cart total and the convert recompute. If you check the total with a naive per-unit calculation it will look wrong when a bundle is in the cart. ## Export and integrations If you have connected Google Sheets, every newly created cart is appended to the spreadsheet automatically. Creating your first spreadsheet from the addon switches on both auto-sync and the abandoned-carts option for you, so the sync starts without a second step. It is a simple way to hand a call list to a team that doesn't have dashboard access; turn either switch off on the addon's card if you'd rather carts stayed in the dashboard. ## Measuring your recovery The **Recovery** rate in the page header is the measurement the dashboard gives you. It counts carts you marked contacted as well as carts that became orders, out of every cart captured, so read it as follow-up coverage rather than sales recovered. A cart records **that** it was contacted, never **how**: there is no channel field on the row, so DZBuild cannot split your recovery rate by call, SMS or email, now or looking back. If you want that comparison, keep it in your own sheet, one line per cart, and check the dashboard rate weekly as the overall number. ## Tips * **Call within 1 hour** when you can. The longer the gap, the colder the customer. * **Lead with a question, not a pitch.** "Did you find what you needed?" works better than "Here's why you should buy." * **Don't push new products on the recovery call.** Just close what's already in the cart. * **If they say "I'll order tomorrow", offer to place it for them** with Convert to order — there's no link that will pre-fill their cart. * **Mark contacted promptly** so your team doesn't call the same person twice. * **Stop chasing after 48 hours.** Past that the call reads as pressure, and the buyer has usually decided or bought elsewhere. * **Spot-check your recovery rate weekly.** A drop usually means a checkout regression — fix the form, not the call script. ## Privacy Abandoned carts include phone numbers, names, emails and wilaya/commune — keep your dashboard access tight via [Team & roles](https://dzbuild.com/docs/operations/team.md). Customers can request deletion via [Contact](https://dzbuild.com/contact). ## What's next * [Orders](https://dzbuild.com/docs/selling/orders.md) — once a cart converts. * [Customers](https://dzbuild.com/docs/selling/customers.md) — see if the abandoner is a repeat or a first-timer. * [Pixels & marketing](https://dzbuild.com/docs/marketing/pixels.md) — retargeting setup. --- Source: https://dzbuild.com/docs/selling/customers.md # Customers Every order creates or updates a customer record. The Customers page gives you a searchable list, a fraud score that flags risky buyers, a linked-identity view that ties one buyer's aliases together, and a blacklist tab for buyers you don't want to ship to again. Permission-gated A staff member needs the `customers.view` permission to reach this page at all — see [Team & roles](https://dzbuild.com/docs/operations/team.md). You don't have to come here to check risk, though: the same fraud score shows up in the order preview on the [Orders](https://dzbuild.com/docs/selling/orders.md) page. ## Video [Customers — manage your customer base in DZBuild](https://www.youtube.com/embed/WSGN4ikRO8o) ## The customer list Open **Dashboard → Customers** at [`/dashboard/customers`](https://dzbuild.com/dashboard/customers). The table columns are: * Customer (name) * Phone * Location (wilaya) * Orders * Total purchases * **Identity** — a badge that opens the linked-identities modal, shown only when the buyer has more than one alias * **Fraud score** badge — `safe` / `low` / `medium` / `high` / `critical` * Actions The page has two tabs: | Tab | What it shows | | ----------------- | --------------------------------------------------------------- | | **All customers** | The full list, default view. | | **Blacklist** | Customers you've banned — orders from these phones are blocked. | **There are no filters.** You get a search box, a rows-per-page selector (10 / 20 / 50, default 20) and pagination. The list is always ordered newest-customer-first and cannot be sorted by spend, orders or date. Search matches first name, last name and phone, and additionally matches an exact **IP address** or an **order number** (full or prefix) from that customer's orders — handy for tracing a fraudulent order back to the buyer. It does **not** match email. A brand-new customer can take up to half a minute to appear in the list. ### Where customer records come from Every customer record is created automatically the first time an order is written for that phone number — from the storefront, a landing page, a manual dashboard order, an abandoned-cart conversion, or the API. A record is identified by its phone number and belongs to a single store, so the same buyer in two of your stores is two separate records. Buyers have no accounts on DZBuild storefronts; they look up an order anonymously via the Track order page. There is no customer CSV import. ## The fraud score Every customer carries a badge — `safe`, `low`, `medium`, `high` or `critical` — summarising their delivery history. What pushes the score **up**: cancelled orders, returned orders, refused deliveries, chargebacks, and being banned by a store. What brings it back **down**: successfully delivered orders, and being unbanned. Having several names or phone numbers tied to the same buyer also raises it, and a customer inherits the **highest score of any identity linked to them**. The exact weighting behind the number is deliberately not published — publishing it would just tell fraudsters how to stay under the badge. The score updates as orders flow in. A `high` or `critical` badge is your cue to check the order before confirming. ## What you can open from a row There is **no per-customer page**. From a row you can open two modals, plus Ban / Unban: * **Fraud details** — the score plus a breakdown of which events produced it. * **Linked identities** — other names, phones and emails tied to the same buyer. * **Ban** / **Unban**. To see a customer's orders, search their phone — or an order number — on the [Orders](https://dzbuild.com/docs/selling/orders.md) page. There is no per-customer notes field; the only note you can leave is the reason attached to a ban. ### Linked identities The **Identity** badge appears on a row when DZBuild has tied more than one alias to the same buyer. Open it and you get a table of the aliases: name, phone, email, link method, first seen, and order count — plus a one-click **ban all linked identities** action. Linking is automatic and runs in the background, so it can lag a few seconds behind a brand-new order. DZBuild only ties two aliases together on a strong signal that they are the same person — a shared address or a shared internet connection is never enough on its own, precisely to avoid flagging unrelated buyers. ## The Blacklist tab Columns: Customer, Phone, Reason, Fraud score, Ban date, Actions. The ban date, the reason you picked and the free-text note are all recorded, so the tab doubles as an audit trail of who banned whom and why. Unban from the row's action button. ## Banning a customer Click **Ban** on the customer's row. The dialog asks for a reason (dropdown) plus an optional free-text note; both are shown back on the Blacklist row. Once banned: * New orders from that **phone number** are rejected at the storefront checkout and on landing pages. * The customer appears in the **Blacklist** tab, and their row in **All customers** shows a banned badge with **Unban** in place of **Ban**. * Existing orders are not changed. Cancel them manually if needed. Three things to know: * **Bans are per-store.** Banning someone in one of your stores does not affect your other stores. * **The phone number is what blocks a ban made here.** The banned email address is checked too, but only on forms that ask for one: the landing-page checkout never collects an email, so on that surface the phone number does all the work. A ban made from an order works differently: by default it blocks only the browser that order was placed from, unless you tick the box that also bans the phone number. Similar devices or a shared network are advisory only, and on their own they never block a buyer. * **Not every way an order can be created runs the check.** A banned buyer can still turn up on your orders list, which is why banned customers keep a red badge on their order rows. Read that badge before you confirm. To reverse, open the Blacklist tab and click **Unban**, or use the Unban button that replaces Ban on the customer's row. ## Segmentation DZBuild has no segment builder, and no VIP or loyalty tier: nothing in the dashboard groups customers by spend or awards them a badge for it. The groupings below are worth tracking, but you build them outside the dashboard by exporting the customers CSV page by page and slicing it in a spreadsheet. Note the list is always sorted newest-customer-first, cannot be sorted by spend, and does not record a last-order date at all, so an "at risk" grouping has to come from the [Orders](https://dzbuild.com/docs/selling/orders.md) page instead. * **Best spenders.** Sort the exported *total purchases* column and pick your own threshold. That total adds up every order of the customer, cancelled and returned ones included, so check their orders before you reward them. Worth special handling and early-access offers. * **Repeat** — ≥ 2 orders. Already trust you; cheapest to win again. * **At risk** — last order ≥ 90 days ago. Win-back campaign target. * **One-and-done** — exactly 1 order. Test if your follow-up brings them back. * **High fraud risk** — `high` or `critical` score. Confirm by phone or skip COD. ## Bulk export Click **Export CSV** to download the customers **currently displayed on the page**. This is a per-page export, not a whole-list export, so with the default 20 rows per page you get 20 customers. Raise the rows-per-page selector to 50 and export page by page for a full list. Columns: first name, last name, email, phone, wilaya, commune, address, orders, total purchases. The search box narrows the export; there are no other filters. Use the file for SMS campaigns, mailing lists, or to import into another CRM. warning Customer data is regulated under Algerian privacy law and DZBuild's terms. Don't share or sell the list. Customers can request deletion. ## Working with the API If you need programmatic access, see the [Customers API](https://dzbuild.com/api-docs/resources/customers.md). Common uses: * Sync customers to a third-party CRM. * Build a custom segmentation tool. * Trigger SMS / email automations on new customers, from the `order.created` webhook (there is no separate customer event) or by polling the customer list. ## Tips * **Check the fraud score** before confirming an order from a new customer. `critical` means call before spending COD shipping. * **The only note you can leave is on a ban.** The ban dialog has a reason dropdown plus a free-text note, and both show on the Blacklist row. There is no general per-customer notes field, so flags for complainers, no-shows and VIPs have to live in your own spreadsheet. * **Bulk-export your best spenders** monthly and run a separate SMS campaign for them. * **Win-back is yours to run.** The dashboard has no win-back tool and no last-order date on the customer row, so build the list from the [Orders](https://dzbuild.com/docs/selling/orders.md) page and call or SMS from there. * **Unban with intent.** If you ban for fake orders, don't unban without a real reason. * **Keep the Blacklist tight.** Banning everyone who returns once turns into a customer-service bottleneck. ## What's next * [Orders](https://dzbuild.com/docs/selling/orders.md) * [Abandoned carts](https://dzbuild.com/docs/selling/abandoned-carts.md) * [Customers API](https://dzbuild.com/api-docs/resources/customers.md) * [Limit Orders Per IP addon](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) * [Captcha Protection addon](https://dzbuild.com/docs/addons/captcha-protection.md) --- Source: https://dzbuild.com/docs/selling/digital-delivery.md # Digital delivery This page covers what happens between a digital order landing in your dashboard and the buyer opening the file, code or account they bought. It only applies to stores running the [Digital theme](https://dzbuild.com/docs/storefront/digital-theme.md); the pages below redirect to the dashboard home on any other theme. For how the buyer's money reaches you, see [Payments](https://dzbuild.com/docs/selling/payments.md). ## What you can store and deliver Everything you deliver lives on the **Secure storage** page (`/dashboard/digital/storage`), under three tabs: * **File** to upload once, 20 MB maximum. Documents, archives and media are accepted (PDF, ZIP, RAR, 7z, Office files, MP4, MP3, images), and so are eBooks (EPUB, MOBI), fonts, design files and Android or iOS app packages (APK, AAB, IPA). Executables such as EXE, MSI or BAT, scripts, SVG and web files are refused. * **Account** made of a login, a password and an optional extra field. Add one at a time, paste a batch, or import a CSV. * **Code** for licence keys, gift cards or recharge codes. Paste one per line, or import a CSV. One stored unit equals one delivery. When you upload a file you also set a **deliverable quantity** (1 to 500): quantity 10 means the same file can be sold to 10 buyers, and it takes 10 slots of your storage tier. The items list groups those copies on one row and shows how many are left and how many were sold. ## Secure storage tiers Secure storage is a paid addon billed per month, per store. Until it is active the page shows only the purchase card, and every upload is refused. | Tier | Items stored | Price | | --------- | ------------ | --------------- | | 300 | 300 | 500 DZD/month | | 600 | 600 | 900 DZD/month | | 1,200 | 1,200 | 1,500 DZD/month | | 3,000 | 3,000 | 2,200 DZD/month | | Unlimited | no cap | 3,000 DZD/month | **Unlimited** is the top tier: no limit on how many items you keep in storage. It is not free storage, and it does not change the 20 MB per file limit. The usage bar at the top of the page counts every deliverable unit against your tier, sold ones included, and splits the total into files, accounts and codes. A sold unit keeps its slot until you delete it, and deleting it also removes it from that buyer's tracking page, so only clear sold units once buyers have saved what they bought. ## Attaching items to a product or a variant Pick the product first. If that product has variants, a second dropdown appears and each option shows how many units are still available for it. Leave it on **All variants (product level)** to store the item for the product as a whole. When an order is confirmed, DZBuild looks for units attached to the exact variant the buyer chose, then falls back to product-level units. If there are fewer units than the quantity ordered, the shortage is recorded and the order is delivered short, so top storage up and hand the rest over yourself. ## Nothing is delivered before the order is confirmed Every digital order arrives as `pending`, free products included, and waits for you. The exception is an order paid with your **CIB / EDAHABIA card** method (Payment Gateway addon, on your own Slick-Pay account): once the card payment is confirmed, the order confirms itself, is marked paid and pulls its items from storage. When every unit could be attached, the delivery email goes out and the order is marked delivered; otherwise it stays `confirmed` for you to finish. For every other order: 1. Open the order from **Digital orders** (`/dashboard/digital/orders`) and check the payment receipt if the buyer paid through a manual method. 2. Click **Confirm order**. This is the moment items are pulled from storage, attached to the order, marked sold, and the payment status flips to paid. 3. Then either **Deliver + send email**, which mails the buyer, or **Mark as delivered**, which only closes the order on your side. The email button appears only when Secure storage is active and units were actually attached to the order. You can always mark an order delivered without it and send the goods yourself through the contact channels collected at checkout. Digital orders use three statuses, `pending`, `confirmed` and `delivered`, plus `cancelled`. A cancelled order can be reopened to `pending`, and cancelling a confirmed order releases its items back into storage. ## What the buyer sees The digital checkout asks for an email address and it is required, because that is where the delivery mail goes. The mail lists the order and its codes and account credentials in the body. Files are neither attached nor linked in it: its button opens your store's `/track-order` page instead. On that page the buyer types the order number and the last 4 digits of the phone number used on the order. Deliverables show up only once the order is confirmed or delivered, and then the buyer gets a **Download** button per file, with the remaining download count and the expiry date next to it, and click-to-copy fields for codes and account credentials. ## Download links expire Each file link works 3 times and stops working 30 days after the order was confirmed. Past the expiry date the page answers that the link has expired, and after the third download it answers that the download limit is reached; either way the buyer has to come back to you. The remaining count and the expiry date are printed under every file on the tracking page, so tell buyers to save their file rather than keep the link. Codes and account credentials do not disappear that way: they stay readable on the tracking page. ## When a buyer says the download does not work Check in this order: 1. **The order is still `pending`.** The tracking page hides every deliverable until the order is confirmed. This is the most common one. 2. **The receipt has not been reviewed yet**, which is why the order is still pending. 3. **The last 4 digits do not match** the phone number on the order. The buyer has to enter the number they ordered with. 4. **Storage was empty for that variant.** Nothing was attached when you confirmed, so there is nothing to download. Add items, then hand the missing units over yourself. 5. **Secure storage is not active on your store.** Without it you cannot add files, codes or accounts to storage, so a store that never had it has nothing to attach, and the **Deliver + send email** button stays hidden. 6. **The link expired or hit 3 downloads.** 7. **No mail arrived.** It is sent when you click **Deliver + send email**, or on its own for a card-paid order whose units were all attached; after that, ask the buyer to check the spam folder. ## Selling subscriptions and renewals There is no recurring product on the storefront today: a buyer is never charged again automatically, and nothing renews on its own. Merchants who sell a monthly service publish each period as its own product, one month, three months and so on, and deliver a fresh code or account for every purchase. Recurring products are planned, with no date. ## What's next * [Payments](https://dzbuild.com/docs/selling/payments.md) for the manual-receipt methods and the Payment Gateway addon * [Digital theme](https://dzbuild.com/docs/storefront/digital-theme.md) for what switching a store to Digital changes * [Digital Product Variants addon](https://dzbuild.com/docs/addons/digital-product.md) for the variant selector on digital product pages * [Orders](https://dzbuild.com/docs/selling/orders.md) for the physical-goods order flow --- Source: https://dzbuild.com/docs/selling/discount-codes.md # Discount codes Two different things are called a discount code on DZBuild. The first is a **promo code** you create for your buyers: they type it at checkout and the order total drops. The second is a code DZBuild issues for your own **subscription** payment. They live on different pages and neither one works in the other's field, which is where most of the confusion comes from. This page covers both, starting with the buyer-facing one. Free add-on, off until you turn it on Promo codes come from the free **Promo codes** add-on, available on every plan including Free. Until you activate it, no code field exists anywhere on your storefront and [`/dashboard/promo-codes`](https://dzbuild.com/dashboard/promo-codes) sends you back to the add-ons page. ## Video [Promo codes in DZBuild](https://www.youtube.com/embed/RZDkm8Ntkw8) ## Turning the add-on on Open the **Add-ons** page at [`/dashboard/addons`](https://dzbuild.com/dashboard/addons), find the **Promo codes** card in the Management Tools section, and switch it on. The card then shows a **Manage codes** link to [`/dashboard/promo-codes`](https://dzbuild.com/dashboard/promo-codes). There is no sidebar entry for the page, so that card is your way back to it. ## Creating a code On the promo codes page, click **Create a code** and fill the dialog: | Field | What it does | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Promo code** | The text buyers type. 2 to 30 characters, letters `A-Z`, digits, `-` and `_` only. Lowercase is turned into uppercase as you type, so `sale20` and `SALE20` are the same code, and each code has to be unique inside your store. | | **Discount type** | **Fixed amount (DA)** or **Percentage (%)**. | | **Discount value** | The amount in DZD, or the percentage. A percentage above 100 is refused. | | **Minimum order amount** | Optional. Under this products subtotal, the code is refused and the buyer is told what the minimum is. Leave it empty for no minimum. | | **Maximum uses** | Optional. Empty means unlimited. | | **Start date** | Optional date and time. Before it, the buyer is told the code has not started yet. Empty means it works right away. | | **Expiry date** | Optional date and time. After it, the code is refused as expired. Empty means it never expires. | A saved code is active immediately. ## Where buyers enter the code Your storefront shows the field in two places: * **The cart checkout page.** A **Use a promo code** button sits in the order summary and opens a small dialog. Once the code is accepted, a green discount line appears above the total and the total updates on the spot. * **Fast checkout on the product page.** An **Enter a promo code** link under the total does the same thing without leaving the product page. On the Digital theme the product page has no fast checkout form (its buy button opens the checkout page), so the code field is on the checkout page only. **Landing pages have no promo code field at all.** A buyer who orders from a landing page cannot use a code, so if your ads point at a landing page, build the offer into the price instead. ## How the discount is calculated The discount is taken off the **products subtotal**, never off shipping. A percentage code takes that percentage of the subtotal; a fixed code subtracts its amount, and it can never take off more than the subtotal itself, so a 1,000 DZD code on an 800 DZD cart makes the products free and the buyer still pays delivery. Your free-shipping threshold is measured on the subtotal **before** the discount, so a code cannot push an order under the threshold and lose the buyer their free delivery. When the order lands in your dashboard, the order detail page shows a **Discount** line with the code that was used, so you can tell which campaign produced the sale. On Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua and We Can Services the parcel is declared at the products subtotal before the code, so the courier collects the full price as if no code was used; check the amount on the parcel before it ships. ## Single-use codes and codes for one customer There is no per-customer field on a promo code. What you can do is give one person a code nobody else has: create it with a name only they receive, set **Maximum uses** to 1, and give it a short expiry. Nothing prevents them from passing the code to a friend, so keep the text hard to guess when the discount is generous. A use is counted the moment the order is placed, including orders you cancel afterwards. Cancelling does not hand the use back; raise **Maximum uses** by one if you want to return it. If two buyers check out in the same second, a capped code can also go one use past its cap. ## Managing codes you already created Each code is a card on the promo codes page showing the discount, the usage counter (used out of the limit, or `∞` when there is no limit), the minimum order, the start date, the expiry, and a status badge: **Active**, **Disabled**, **Expired** or **Exhausted**. A card carries three actions: * **Disable** turns the code off while keeping its history, and **Enable** brings it back. * **Edit** changes the discount, the minimum, the cap and the dates. The code text itself is hidden while editing and cannot be changed. To rename a code, create the new one and disable the old one. * **Delete** removes it. Orders that already used it keep the code recorded on the order. ## What promo codes cannot do * Apply to one product, one category or one variant. The discount always applies to the whole products subtotal. * Restrict a code to a specific customer, or to first-time buyers. * Cap how much a percentage code takes off a large cart. * Give free shipping. Free delivery is set in your shipping rates, not with a code. * Stack. One order carries one code. * Generate a batch of codes in one action. Codes are created one at a time. ## DZBuild subscription discount codes This is a separate system, and merchants regularly mix the two up. When you pay for your own plan, the checkout sheet at [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) has a field for a discount code: type it in and press **Apply** before you pick a payment method. DZBuild issues these codes during offers; you cannot create them yourself, and a promo code from your storefront is not valid there. Percentage codes are honoured on every payment method. A flat-amount code applies only when you pay by global card, and the sheet tells you so when you apply it. See [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md) for the full checkout. ## Tips * **Give each campaign its own code.** The order detail records the code, so separate codes are the only way to tell an Instagram offer from a returning-customer offer. * **Set a minimum order** on generous codes. Without one, a 500 DZD code on a 600 DZD basket eats the margin and you still pay delivery. * Percentage codes read better in ads, fixed codes protect you better on expensive carts. Pick per campaign, not per store. * **Put an expiry on every promotional code.** Codes with no end date resurface in screenshots months later and still work. * **A code is not a sale.** For a real markdown that every visitor sees, drop the prices from [Products](https://dzbuild.com/docs/selling/products.md) with the bulk price action and set a compare-at price so the old price is struck through. ## What's next * [Orders](https://dzbuild.com/docs/selling/orders.md) to see the discount line on a paid order. * [Products](https://dzbuild.com/docs/selling/products.md) for store-wide markdowns instead of codes. * [Add-ons overview](https://dzbuild.com/docs/addons/overview.md) for the rest of the free add-ons. * [Subscriptions](https://dzbuild.com/docs/plans/subscriptions.md) for your own billing codes. --- Source: https://dzbuild.com/docs/selling/getting-paid.md # Getting paid Selling on DZBuild does not put your revenue inside DZBuild. There is no store balance, no wallet page and no payout button in the dashboard, because the money never arrives here in the first place. A buyer pays your courier or pays your own account, and you pay DZBuild separately for the plan you use. ## DZBuild never holds your money What the platform records is the order: the amount, the buyer, the items, the status. Moving the actual cash is between you and either your courier or your buyer. * DZBuild takes **no percentage** of any sale, on any plan and at any volume. * Nothing is deducted from what you collect. No order fee, no transfer fee, no clearing delay. * You do not open an account with DZBuild to receive money, and there is no document check: no ID, no registre de commerce. The only check before you can sell is the code emailed to you when you sign up with an email and password. ## Physical orders: your courier collects and pays you Every physical store runs on [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md). The courier hands over the parcel, takes the cash from the buyer, and pays you afterwards. * **The courier pays you directly**, into whatever account you agreed with them when you opened your courier account. DZBuild is not part of that transfer and has no visibility into it. * **The cadence and the delivery fee belong to the courier**, not to DZBuild, and they differ from one company to the next. Ask your courier's account manager for their remittance cycle before you plan cash flow around it. * **Which amount the courier is told to collect depends on the provider.** Some receive only the product subtotal and add their own tariff on top; others receive the order total including shipping. [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md) lists which family does what. ## Digital orders: the buyer transfers to your own account A Digital-theme store has no courier and no cash. The buyer either picks one of the accounts you published, transfers the money to it outside the platform and uploads a screenshot of the transfer at checkout, or pays by CIB / Edahabia card when you have added the card method, in which case the money lands in your own SlickPay account. * You define those accounts yourself on the digital payment page ([`/dashboard/digital/payment`](https://dzbuild.com/dashboard/digital/payment)): method name, account-holder name, the payment details and the instructions the buyer reads. Up to **10 methods per store**. * The built-in types are **CIB / EDAHABIA card** (paid into your own SlickPay account, set up with its public key), **CCP**, **BaridiMob** and **RedotPay**, plus **Custom** for any other manual bank transfer you want to accept. * The money goes from the buyer's account into yours. DZBuild only stores the receipt image so you can check it. * For a transfer, you open the order on the digital orders page ([`/dashboard/digital/orders`](https://dzbuild.com/dashboard/digital/orders)), look at the screenshot, and mark the payment as received. Nothing is verified automatically. A card payment needs no check: the order is confirmed and marked paid on its own once the payment goes through. * Each method priced in DZD can carry an **extra fee expressed as a percentage**. It is added server-side to the buyer's total, and you collect it with the rest. Publishing payment methods on a digital store needs the paid **Payment Gateway** addon (500 DZD per month). Until it is active that page shows only the purchase card and no method can be saved. The full walkthrough is on [Payments](https://dzbuild.com/docs/selling/payments.md). ## What DZBuild charges you One subscription, plus anything else you deliberately buy in your dashboard. | What | Price | | ------------------------------------- | -------------------------------------- | | Free plan | 0 | | Pro | from 1,000 DZD per month | | Unlimited | from 2,500 DZD per month | | Enterprise | from 5,500 DZD per month | | Payment Gateway addon, digital stores | 500 DZD per month | | Secure storage for digital files | from 500 DZD per month, priced by tier | Longer terms cost less per month; the full grid is on [Upgrades and renewals](https://dzbuild.com/docs/plans/upgrades.md). You pay by CIB / Edahabia, by global card in US dollars, or, for plans only, by BaridiMob receipt. None of it is ever taken out of an order. ## What you pay outside DZBuild **The courier's delivery fee.** It is set by the courier, per its own tariff. How much of it you pass on to the buyer is your decision, in your [shipping rates](https://dzbuild.com/docs/selling/shipping.md). **The weight surcharge.** Carts above 5 kg add 50 DZD per extra kilogram to the shipping the buyer pays, and 100 DZD per extra kilogram in the 13 deep-south wilayas when your store's default courier is Yalidine, Yalitec or Guepex. This mirrors the courier's own weight rule and DZBuild applies it at checkout, so the extra weight is not paid out of your own pocket. It is not a DZBuild fee and DZBuild does not receive it. If you would rather not have it on a product, leave that product's weight empty, or give the product free shipping. The surcharge is skipped whenever the order already ships free. ## Frequently asked **Q: When a customer pays, does the money land in a DZBuild account first and then get transferred to me?** A: No. There is no intermediate account. COD cash goes buyer to courier to you. A digital transfer goes from the buyer straight into the account you published, and a card payment on a digital store goes into your own SlickPay account. **Q: Does DZBuild take a commission on orders?** A: No. The subscription is the whole price, whatever you sell and however much. **Q: Do I need a bank account or a card to sell?** A: Not to sell. You need an account your courier can pay into, or, on a digital store, whatever account you publish for buyers. A card or a BaridiMob transfer is only needed to pay for your own DZBuild plan. **Q: How long before I see my COD money?** A: Ask your courier. The schedule is theirs, it varies between companies, and DZBuild has no part in it. **Q: Can my customers pay by card on my storefront?** A: On a Digital-theme store, yes: with the Payment Gateway addon active, add the CIB / Edahabia card method with your own SlickPay public key, and buyers pay by card into your SlickPay account. Physical stores use COD; card checkout for them is planned, with no date announced. **Q: Can I sell to buyers outside Algeria?** A: Not for now. DZBuild stores serve Algeria, and other markets are planned with no date announced. ## What's next * [Payments](https://dzbuild.com/docs/selling/payments.md): how the checkout collects the payment in the first place. * [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md): the full COD lifecycle and which amount each courier collects. * [Shipping](https://dzbuild.com/docs/selling/shipping.md): per-wilaya rates, free shipping and the weight rules. * [Upgrades and renewals](https://dzbuild.com/docs/plans/upgrades.md): the full price grid and how to pay DZBuild. --- Source: https://dzbuild.com/docs/selling/landing-pages.md # Landing pages Landing pages are single-product conversion pages designed for paid traffic. Strip everything that doesn't sell, focus on one product, drive to a single CTA. DZBuild gives you a fast manual builder and a one-click AI generator on top of the same data model, so you can iterate without rebuilding. ## Video [Landing pages — create a landing page with AI in DZBuild](https://www.youtube.com/embed/LDBOx4tLQiI) ## Storefront vs. landing page | Use the storefront when | Use a landing page when | | ----------------------------- | ------------------------------ | | The customer is browsing | The customer clicked an ad | | You sell 10+ products | You're pushing 1 product hard | | Organic / repeat traffic | Facebook / TikTok / Google Ads | | The customer needs to compare | One offer, one decision | A landing page lives at `https://{your-store}.dzbuild.app/landing/{slug}` (or under your custom domain). It does **not** show your storefront navigation, search bar or footer — just the offer. ## How many landing pages can I have? Per-plan caps: | Plan | Landing pages | | -------------- | ------------- | | **Free** | 0 | | **Pro** | 3 | | **Unlimited** | Unlimited | | **Enterprise** | Unlimited | Landing pages come with your plan. Individual pages are no longer sold separately, so the cap in the table is what you get. Plan the expiry date around your campaigns: when a plan expires your storefront closes to customers and your custom domain is removed, so ads pointing at those URLs keep spending on a dead page. To upgrade or renew, open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and click **▶ How to renew** for the in-app guided tour, or check the video tutorials on the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off). ## Where to find landing pages Open **Dashboard → Landing pages** at [`/dashboard/landing-pages`](https://dzbuild.com/dashboard/landing-pages). The page is a card grid with a search box above it, which filters the loaded cards by title **or** URL, client-side. Each card shows: * The page title * The creation date * The number of sections * The view count * An **Active** badge * The page's public URL in a read-only box with a copy button — the slug is visible inside that URL, there's no separate slug field on the card Three actions per card: **Edit**, **Preview** (opens the live page in a new tab), **Delete**. Every landing page you create in the dashboard is created and saved as `active`. There is no Draft state in the merchant UI. A page that Copilot or the API builds section by section starts as a draft by default and stays offline until it is published, even though its card in this list shows **Active**. Saving such a page from the dashboard editor with **Save all changes** publishes it. ## Two ways to create ### Option 1 — AI-generate a draft Click **Generate with AI** at the top of the list (or go to `/dashboard/landing-pages/ai-generate`). Pick the product, give the page a title, optionally add a one-line angle ("Mother's day gift", "for hot summer"), and the generator designs a complete page in a couple of minutes. The page is drawn as one tall image (three stacked images for the tall size) with the text written into the artwork, followed by an order form in matching colours. The artwork covers: * Headline + sub-headline * Pain → solution sections * Benefits list * Generated scene images for the product in context * Trust signals * Call-to-action with the order form What the wizard asks for: * **A product that already has at least one image.** Products with no image are greyed out and cannot be selected. * **A page title**: required, at least 3 characters. * **The angle / description** — a free-text box that accepts up to 2,000 characters. * **The page language** — Arabic, French or English. * **The page size** — the standard page costs **20 AI credits**, the tall (3-panel) page costs **45**. The tall option is greyed out when your balance can't cover it. See your balance at [`/dashboard/ai-credits`](https://dzbuild.com/dashboard/ai-credits). The language you pick here is stored **on the landing page itself**: it does not follow your store language, and it drives the page's text direction. In the dashboard it is only settable in the AI wizard: manually created pages are always Arabic/RTL, and the editor has no language setting. Pages created through Copilot or the API can use any of the three languages, and the API can change it later. The generated images are ordinary **Image** sections: the words are part of the picture, so you change them by swapping the image, not by typing, and you can add your own sections around them. There is no per-block regenerate: to get a different draft you run the generator again, which charges credits again. A run that fails gives the credits back automatically. ### Option 2 — Build manually Click **Create a page** (`/dashboard/landing-pages/create`). A 3-step wizard asks you to (1) pick the product, (2) enter the page title, URL slug and SEO description, (3) create. There are no templates — the page starts empty and you add sections in the editor. Older AI-generated pages may contain PAS blocks (Problem / Agitation / Before-after / Solution / Features / CTA). They stay editable, but they cannot be added by hand, and new AI pages no longer use them. ## Section types Fourteen section types can be added manually, each with its own style controls: | Section | What it does | | -------------------- | -------------------------------------------------------------------------------------------------- | | **Image** | A single full-width image block. | | **Image carousel** | Several images the visitor can swipe through. | | **Announcement bar** | A thin banner strip for a promo line. | | **Special offer** | A highlighted offer block. | | **Price display** | Price + compare-at price as a standalone block. | | **Product offers** | Quantity-tier offer cards ("1 box", "2 boxes", …). See below. | | **Order form** | The full inline order form. | | **Order button** | A CTA button that scrolls to / opens the order form. | | **Free text** | Rich free text. | | **Contact button** | A WhatsApp / phone contact button. | | **Countdown** | A countdown timer for urgency. | | **Fake visitors** | A "N people are viewing this page" counter. | | **Testimonials** | Customer review cards. | | **Custom form** | A lead form with your own fields (this is the only place an email field exists on a landing page). | ### Product offers and `follow_offers` Each offer row in a **Product offers** section carries its own quantity, price, compare-at price, badge, image, featured flag and free-shipping flag. Separately, an **Order button** section (or an order form rendered as a button) has a **Price follows the product's offers (by quantity)** toggle, on by default for new sections. When it is on and the quantity field is shown, the quantity the buyer picks is matched against the **quantity offers configured on the product itself** (Products → the product → offers), not against this section's rows, and an exact match re-prices the order to that offer's price and applies its free-shipping flag. The match and the final price are always recalculated from the offers you saved on the product. The price the browser sends is never trusted. Free shipping chosen inside a **Product offers** section is likewise re-read from the offer you saved on that section. ## Linking a product Every page you create in the dashboard is bound to a product: the create wizard will not finish without one, and the editor lets you switch to another product but not remove it. A page with no product (for example one created through Copilot or the API) or with an inactive product shows a **No product** or **Product inactive** warning on its card; click it to attach a product in the page settings. Why it matters: > When the order form is bound to a product, shipping is calculated from your store's per-wilaya rates plus any per-product overrides. **A landing page without a product binding can silently undercharge shipping** — especially with the [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) addon, which needs the product to look up the correct rate. If you sell a bundle that doesn't map to one product, create a placeholder product (with the bundle's actual weight + dimensions + shipping rules) and bind the landing page to it. ## Editing sections In the landing-page editor (`/dashboard/landing-pages/:id/edit`): * **Drag sections** by the grip handle to reorder — this is the reorder method on desktop. On a narrow screen (768px or less) each section card also shows ▲ / ▼ arrows that move it one place, disabled on the first and last section. * Click **Delete** to remove a section. * Click a section's pencil icon, or click the section in the preview, to open its settings. * A **copy icon** on each section card duplicates that section. Save propagates instantly — no separate publish step. ### The preview pane The right-hand pane is not a mock-up: it is the actual public page, rendered by the same code that serves it to buyers, inside an iframe. What you see is what buyers get. Style and text edits patch the preview instantly; structural edits reload the iframe once the autosave confirms. Don't try to share that preview URL: it is login-gated, requires the landing-pages **Edit Pages** permission in [Team & roles](https://dzbuild.com/docs/operations/team.md) and is sent with `noindex` and a same-origin frame policy, so it is useless to anyone outside your dashboard. Use the card's **Preview** action (the real public URL) when you want to send the page to someone. ## The order form The most important block. Configure: * **Fields and their on/off switches**: commune, address and quantity each have a switch. **Name, phone and wilaya cannot be switched off**: they are locked on and marked required in the editor. * **Required fields**: the server accepts an order only if **name and phone** are filled and the phone is an Algerian mobile number (`05`, `06` or `07`, also accepted with the `+213` or `00213` prefix). * **Optional fields** — full address, quantity, and one merchant-defined free-text field (label, placeholder, required toggle) whose value is appended to the order's seller notes. There is **no email field** on the landing-page order form — landing-page orders are always stored with an empty customer email. If you need an email address, add a **Custom form** section instead. * **Variants** — the form renders the product's variant groups with full product-page parity (thumbnails, price pills, sold-out and dead-end states). The three group types are `color` (colour swatch cards), `text` (plain option buttons — this is what a group named "Size" uses) and `image_text` (thumbnail cards). Multi-select `selectable` groups reuse the image-text card markup and are optional rather than required. * **Bundles / quantity offers** — "Buy 2 + 1 free" with auto-quantity. Pair with the [Offer Variant Popup](https://dzbuild.com/docs/addons/offer-variant-popup.md) addon for clean per-piece variant selection. * **Pixel events**: the landing page fires `ViewContent` on load, `InitiateCheckout` once per order form when the visitor first sends it, and `Purchase` on a successful order submit (browser pixel plus server-side Conversions API for Facebook, TikTok, Snapchat and Pinterest, deduplicated by event ID). A **Custom form** section fires `Lead` instead (`SubmitForm` on TikTok, `SIGN_UP` on Snapchat, `generate_lead` on GA4) and produces neither `InitiateCheckout` nor `Purchase`. Landing pages never fire `AddToCart`. Submission stays inline — no redirect, the confirmation appears on the same page so you don't lose customers between steps. ## Pixels and analytics A pixel can be targeted to specific landing pages. Useful when: * A specific campaign uses a different Pixel ID for clean attribution. * You're A/B-testing two creatives and want separate audiences. Targeting is set on the pixel, not on the page: open [`/dashboard/pixels`](https://dzbuild.com/dashboard/pixels), click **Customize** on the pixel card and pick the landing pages. The targeted pixel fires on those pages in addition to your global pixels, not instead of them. The **Customize** button shows on the Unlimited and Enterprise plans. See [Pixels](https://dzbuild.com/docs/marketing/pixels.md) for the full setup. ## Duplicating Duplicating a whole landing page is not available in the dashboard today. To A/B-test a different headline, hero or CTA, create a second page and rebuild the sections, then split one ad link between the two pages with the [A/B Testing addon](https://dzbuild.com/docs/addons/ab-testing.md). You *can* duplicate an individual **section** inside the editor with the copy icon on the section card. ## Tips * **Always bind the page to a product**, even for bundles. It's the only way shipping math is right. * **Show a "Cash on Delivery" badge** prominently. Algerian buyers trust this and convert better. * **Keep the form short.** Ask for what you need to deliver the order and nothing more. * **Real product photos beat stock images** on Algerian traffic. * **Know what the built-in bot checks cover.** Every landing-page form runs a few light checks against automated submissions, and a script written for your page can get past them. Treat them as a speed bump, not as protection. * **Add a [captcha](https://dzbuild.com/docs/addons/captcha-protection.md)** if fake orders from ads are costing you money. The addon puts a real challenge in front of the form. * **Test at phone width first.** That is where your ad traffic lands. ## What's next * [Pixels & marketing](https://dzbuild.com/docs/marketing/pixels.md) * [Recover abandoned carts](https://dzbuild.com/docs/selling/abandoned-carts.md) * [Custom Product Shipping addon](https://dzbuild.com/docs/addons/custom-product-shipping.md) * [Captcha Protection addon](https://dzbuild.com/docs/addons/captcha-protection.md) --- Source: https://dzbuild.com/docs/selling/orders.md # Orders Every order moves through a set of statuses, some of which you set by hand and some of which DZBuild sets for you. This page covers the orders list, the preview popup and detail page, the call-confirm workflow most Algerian merchants run, sending orders to a courier, and the [Advanced Orders](https://dzbuild.com/docs/addons/advanced-orders.md) CRM addon for sub-statuses and call attempts. ## Video [Orders — how to manage orders in DZBuild](https://www.youtube.com/embed/-_dDZOKzvrU) ## The orders list Open **Dashboard → Orders** at [`/dashboard/orders`](https://dzbuild.com/dashboard/orders). Each row shows: * Selection checkbox * Order number, with a product thumbnail (a **+N** badge when the order has several items), a traffic-source icon and the label you've set, if any * Customer name and phone — with a fraud-score badge, and a red badge if you've banned that customer * Total * Status pill, plus a truck badge once the order has been sent to delivery, a **Return on the way** chip while a courier return has not given its stock back yet, and a **No trace at the courier** chip when the courier keeps answering that it cannot find the parcel (status and stock are left as they are) * Date and time * Actions: view, label, edit (printing is in the order preview popup) Wilaya and commune are **not** columns; they appear in the order preview popup and on the detail page. Order numbers: the list shows a short per-store number (`#1`, `#2`, …), counted separately for every store. The full system reference used on courier labels, emails and the track-order page is `ORD---<8 hex characters>` (for example `ORD-11-20260804-3F9A2B1C`), or `LP-<8 hex characters>` for an order taken on a landing page. Numbers are never reused, so a gap after a deleted order is normal. Filter by: | Filter | Use | | ---------------- | ------------------------------------------------------------------------------------------------------------------ | | Status | Find all `pending` orders to call, or pick **Return on the way** to list returns whose stock has not come back yet | | Period | All periods / Today / This week / This month (fixed presets, not a free date range) | | Wilaya | Plan courier hand-overs by region | | Delivery type | `home` / `desk` / `pickup` | | Sent to delivery | Sent / not sent — how you find the day's un-dispatched orders | | Duplicates | Same phone ordering the same product across more than one order | There is no filter by delivery company and no payment filter — storefront orders are cash-on-delivery. Search by phone, customer name, or order number from the search box at the top. From two characters on, it also matches the order label, the customer and seller notes, and the product name or SKU. ### Live orders Leave the Orders page open during a campaign: new orders arrive in real time. A toast appears and a short chime plays, no refresh needed. On the first page, with no search and no filter other than the period or not sent, the row is injected at the top of the list with a flash animation and the counters bump. Otherwise a **New orders** button with their count appears; click it to clear the filters and see them. ### Order labels Each order can carry a short text label of up to 60 characters, a lightweight way to tag orders ("call back tomorrow", "needs address check") straight from the list, without installing the Advanced Orders addon. Click the bookmark icon in the row's actions to add, change or clear it. The chip shows under the order number in both the desktop table and the mobile card, and the search box finds orders by their label. ### Where did this order come from? Every order carries a small traffic-source icon (Meta, TikTok, Google, Direct, …). DZBuild works it out at checkout time from, in order: click IDs (`fbclid`, `ttclid`, `gclid`), UTM tags, the referring domain, and finally in-app-browser detection (Instagram, Facebook, TikTok, Snapchat, Threads, YouTube, Telegram). An order opened from an in-app browser with no pixel installed often lands as direct/other, and orders placed before this feature shipped have no source at all. ## Order limits per plan | Plan | Orders per calendar month | | -------------- | ------------------------- | | **Free** | 30 | | **Pro** | Unlimited | | **Unlimited** | Unlimited | | **Enterprise** | Unlimited | When a Free-plan store reaches 30 orders in a calendar month, the storefront closes: the **home page, product pages and the checkout page** are replaced by a "store closed" notice, and both storefront and landing-page order submissions are rejected — it is not just the checkout button. Orders already placed are untouched and the dashboard stays fully usable. Manual orders created from the dashboard also count against the limit. The counter resets automatically on the 1st of the month, or immediately when you upgrade. The orders page shows a live usage card with a progress bar, the remaining count and a days-until-reset countdown, a warning from 80% and a red banner once you hit the limit. To upgrade, open [`/dashboard/subscribe`](https://dzbuild.com/dashboard/subscribe) and click **▶ How to renew** for the in-app guided tour, or watch the [DZBuild YouTube channel](https://www.youtube.com/@DZBuild-off) tutorials. ## The state machine ``` pending → confirmed → processing → shipped → delivered ↓ ↓ cancelled cancelled / returned ``` note The diagram is the normal path, not an enforced one — the status picker lets you move an order to any of the seven statuses at any time. `processing` is also set automatically the moment you send an order to a courier, and `shipped` / `delivered` / `returned` are set automatically by the courier tracking sync. | Status | Description | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `pending` | Customer placed the order; you haven't reviewed it yet. | | `confirmed` | You've called and verified. With the default setting, stock is decremented here. | | `processing` | Being packed / prepared, or just sent to a courier. | | `shipped` | Handed to the courier; tracking number issued. | | `delivered` | Customer received it. | | `cancelled` | Cancelled before delivery — stock is restored if it had been decremented. | | `returned` | The parcel is on its way back to you or already back, set by the courier tracking or by hand. A negative event is recorded against the customer's fraud score. A return you set by hand restores committed stock at once; a return the courier reports gives it back later (see Stock effects below). No refund is logged for a store order; a `refunded` payment state exists only on digital-store orders. | ### Stock effects * By default, stock is **decremented when the order moves to `confirmed`**, not at `pending`. This protects you from spam orders. To reserve stock as soon as an order arrives instead, open the display settings gear on the Orders page and set **Stock deduction** to **On order receipt**. Only the store owner or a member allowed to edit orders can change it; orders already pending are deducted when confirmed, as before. * Stock counts as committed while the order is `confirmed`, `processing`, `shipped` or `delivered`, and also while `pending` when the store deducts on receipt. * Cancelling an order, or setting it to `returned` yourself, **restores stock** at once whenever it had been committed, even if the order was moved back to `pending` in between. Cancelling an order whose stock was never committed changes no stock. * A return reported by the courier keeps the stock out while the parcel travels back, and the order shows a **Return on the way** chip. The stock comes back when the courier reports the parcel back with you, when you click **Return received** in the order preview popup or on the order page, or on its own 15 days after the courier reported the return (the order page shows that date). To settle several at once, pick **Return on the way** in the status filter, tick the orders and click **Returns received** in the bulk bar. * Sending a still-`pending` order to a courier moves it to `processing`, which is the moment its stock is deducted. * **Deleting** an order whose stock had already been committed puts that stock back, a `pending` one included when the store deducts on receipt; under the default setting, deleting a still-`pending` order changes nothing. ## Opening an order Clicking an order row opens a quick **preview popup** in the list: items, customer, totals, a status changer, a call button, send-to-delivery and print label. To open the full standalone page at `/dashboard/orders/`, use the eye icon in the Actions column. The pencil icon opens the full edit page at `/dashboard/orders//edit`. ### The order detail page * **Status pipeline** — a read-only visual bar showing where the order is now (pending → confirmed → processing → shipped → delivered, with a cancelled/returned branch). It is display-only: change the status from the status picker in the preview popup or on the detail page, not by clicking the pipeline. * **Items** — what was ordered, with variants, prices, totals. * **Customer** — name, phone, address. The preview popup also shows a small badge counting how many orders this phone number has placed with you, displayed only when it is more than one. It's an indicator, not a link — to see the customer's other orders, search their phone number in the orders search box or open [Customers](https://dzbuild.com/docs/selling/customers.md). * **Shipping** — wilaya / commune, courier, tracking number, delivery type (`home` / `desk` / `pickup`). * **Payment** — cash on delivery, and the amount to collect. * **Notes** — two separate fields: *Customer notes*, whatever the buyer typed in the checkout form (so this one is customer-supplied, not internal), and *Seller notes*, your own internal notes. Both are editable from the order page. Landing-page custom form fields are appended to the seller notes as `label: value` lines and render as chips. The core order page keeps no per-change audit log. A full timestamped status history, with the agent who made each change, exists only in the [Advanced Orders](https://dzbuild.com/docs/addons/advanced-orders.md) addon. ### Editing an order The full edit page at `/dashboard/orders//edit` lets you: * Change customer details, wilaya and commune — shipping recalculates live. * Change the delivery type. * Add or remove products, change quantities, and edit a line's price. * Apply a discount. * Override the shipping price by hand. note The **Edit** button in the preview popup opens this same full edit page, so a shipping price you set by hand is kept when you save. ### Deleting an order There is no delete button on the orders list. The row actions are **view**, **label** and **edit**, and the bulk bar that appears when you tick rows carries the courier picker, **Send to delivery**, **Returns received** (for returns still on the way) and **Clear selection**. Delete lives on the **order detail page**. Open the order with the eye icon, use the delete action there, and confirm. It is permanent: there is no trash, no archive and no un-delete, so an order removed by mistake has to be re-entered by hand. Deleting an order whose stock had already been committed puts that stock back. **There is no bulk delete**, and none is available yet on any plan. To clear a batch of fake or spam orders today, open them one at a time, or leave them as `cancelled`, which keeps them out of your working filters while the record survives. ### Create an order by hand Taking orders by phone, Instagram DM or WhatsApp? Add them from the orders page: search a product, pick variants and quantity, then fill in the customer's details and their wilaya / commune — shipping is priced from your store's rate table. Manual orders start as `pending`, are cash-on-delivery like any other order, and **do count** against the Free plan's 30-per-month limit. Creating one needs the `orders.edit` permission. ## The call-confirm workflow Most Algerian merchants run a phone-confirm flow: 1. Order arrives as `pending`. 2. You call the customer to confirm the order is real and still wanted. 3. Mark as `confirmed` if real → stock decrements, ready to ship. 4. Mark as `cancelled` if fake or customer-cancelled → no stock used. A green **Call** button in the order preview popup (and in the Advanced Orders table) turns the customer's number into a `tel:` link, so the call is one tap away on mobile. It lives in the list's preview popup, not on the standalone order detail page. For a dedicated CRM-style page with sub-statuses, call-attempt tracking and a full per-order timeline, install [Advanced Orders](https://dzbuild.com/docs/addons/advanced-orders.md). ## Spotting bad orders * **Fraud score** — every order shows a badge for that phone number, built from its cancellation, return and successful-delivery history. Moving an order to `cancelled`, `returned` or `delivered` feeds that history. * **Ban a customer**: from an order (the preview popup or the order page), pick a reason and confirm. By default the ban blocks new orders from the browser that order was placed from; tick the box that also bans the phone number to block the number too, which is what a ban on the [Customers](https://dzbuild.com/docs/selling/customers.md) page does. When DZBuild has no browser on record for the order, it bans the phone number instead. A red badge marks orders from banned phone numbers. Banning needs the `customers.edit` permission. * **Duplicates filter** — surfaces the same phone number ordering the same product across more than one order, which is the usual shape of a double-submit or a prank. ## Sending an order to a courier Link a courier first at [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping) — see [Shipping](https://dzbuild.com/docs/selling/shipping.md). Once one is linked, the preview popup and the order detail page both show a **Send to delivery** button: 1. Pick a delivery provider from the dropdown (shown only if you have several linked; your default is marked with a ⭐). 2. Click **Send**. DZBuild calls the courier's API, gets back a tracking number and stores it on the order along with the courier's name, flags the order as sent, and moves the status from `pending` / `confirmed` to **`processing`** — not `shipped`. An order already in any other status keeps that status. If the order was still `pending`, this is the moment stock is deducted. The order then moves to `shipped` / `delivered` / `returned` on its own as the tracking sync reads the courier's status. If you set a sent order to `cancelled`, DZBuild first checks the parcel at the courier: with Noest, Maystro, Ecom Delivery and Elogistia, a parcel that has not moved yet can be cancelled there too with **Cancel at the courier and here**. Otherwise choose **Cancel here only** and also cancel the parcel in the courier's own space, or the driver may still come. The send dialog lets you choose the **courier**; for Noest and Zimou Express it also carries a **The customer can open the parcel before paying** box, ticked by default. Home vs desk vs pickup is a property of the order itself, set by the customer at checkout. To change it, edit the order (the **Edit** button in the preview popup, or `/dashboard/orders//edit`), which also recalculates the shipping cost. A desk send is refused **by DZBuild**, before any API call, when the synced courier data says that wilaya has no desk. If the courier's API refuses the send or is down, DZBuild shows the error and the order stays unsent. If the courier does not answer in time, the parcel may already exist on its side: the message names the order reference, so look it up in the courier's space before you send again. ## Tracking after the hand-off Once the order has a tracking number, DZBuild re-checks the courier automatically and maps the courier's current status onto the order status (`shipped`, `delivered`, `returned`, `cancelled`). A parcel the courier starts sending back shows as `returned` straight away; see Stock effects above for when its stock comes back. A change on the courier's side can take a little while to show up on the order. The order page and the preview popup show the resulting order status as a single line, with a **Refresh** button for an on-demand check. There is no per-event courier history — only the latest status is stored. An unrecognised courier status is ignored rather than guessed, so a rare status can leave the order where it is until you set it by hand. ## The buyer's tracking page Every storefront has a public order tracking page at `/track-order` (`/track` opens it too). When a buyer asks where their order is, send them there: they need no account, only the order number, typed or pasted, with or without a leading `#`. Your storefront's navbar links to the page on every theme, and two buttons open it with the number already filled in and the order on screen: the track-order button on the confirmation page shown after checkout, and the **Track my order** button in [WhatsApp Sender](https://dzbuild.com/docs/addons/whatsapp-sender.md) messages. The page searches by the full reference (`ORD-…` or `LP-…`), not by the short `#1`, `#2` number from your orders list, and it only finds orders of your own store; a number it cannot match gets a not-found message. When a buyer has only the short number, open the order detail page, where the full reference is printed in small type next to it. To send a buyer a direct link, add the reference to the address: `https:///track-order?order=`. What the buyer sees, in your store's language (Arabic or French), on every theme except Digital: * The order number, the order date and a status badge. * A five-step progress bar: `pending`, `confirmed`, `processing`, `shipped`, `delivered`. A cancelled order shows a cancelled badge and no progress. * Each product with its picture, quantity and line total, then the subtotal, the shipping cost when there is one, and the total. The status comes straight from the order, so when the courier tracking sync moves it to `shipped` or `delivered`, the buyer sees that too. The page never shows the buyer's name, phone or address, the courier or the tracking number. On the [Digital theme](https://dzbuild.com/docs/storefront/digital-theme.md) the page has three steps, `pending`, `confirmed` and `delivered`, and shows only the total; for a confirmed or delivered order it also asks for the last 4 digits of the phone number used on the order before it shows files, codes or accounts. See [Digital delivery](https://dzbuild.com/docs/selling/digital-delivery.md). ## Printing a label The **Print** button in the order preview popup prints the order's label. * If the order has already been sent to an Ecotrack-powered courier or Elogistia **and has a tracking number**, you get that courier's own PDF bordereau. * For every other courier, and for orders not yet dispatched, DZBuild prints its own sheet: store name and phone, customer name, phone and address, the item list with quantities and prices, subtotal / shipping / total, the tracking number when there is one, and a QR code that reopens the order in your dashboard. On mobile — and on desktop when the popup is blocked — the sheet renders inline instead of opening a print window. For per-product label customisation, see [Custom Delivery Label](https://dzbuild.com/docs/addons/custom-delivery-label.md). ## Bulk actions Ticking order checkboxes (or the header select-all) reveals the bulk bar: **Send to delivery**, with a courier dropdown when more than one courier is linked, and **Returns received**, which gives back the stock of the ticked returns that are still on the way (shown to members who can edit orders). The bulk bar only exists when at least one courier is linked. Orders already sent have their checkbox disabled, except returns still on the way, which you can tick for **Returns received**. Maximum **50 orders per operation**. Results come back in a modal split into sent / failed / skipped. There is no bulk delete, no bulk status change, no bulk label generation, and no CSV or Excel export of orders in the dashboard. Deleting is one order at a time from its detail page, as described under [Deleting an order](#deleting-an-order). The closest thing to an export is the **Google Sheets** addon, which pushes orders out to a spreadsheet. ## Who can do what Orders are permission-gated at three levels — **view**, **edit** and **delete** (a fourth **export** checkbox exists in the team screen but is not wired to anything today) — so a call-centre worker can be given view + edit without the ability to delete orders. Note that confirming an order, editing it, creating one by hand and sending it to a courier all share the same `orders.edit` permission; they can't be granted separately. ## Notifications When a new order arrives: * **On the Orders page** — the row is injected live at the top of the list with a flash, a toast appears and a short chime plays. There is no notification-bell centre in the dashboard and no on/off switch for the chime; it plays only on the Orders page. * **Email** to the store owner. * **Push** — turn the Push switch on at [`/dashboard/notifications`](https://dzbuild.com/dashboard/notifications) and accept the browser prompt. This works in any browser that supports Web Push; installing the dashboard as a PWA is not required (though on iOS it is, which is why the page shows an iOS hint). In the DZBuild mobile app the same row is labelled "app notifications". * **Telegram** — connect one or more accounts; each team member gets their own seat with independent new-order and status-change toggles. * **Discord** — same per-channel new-order and status-change toggles. The channels you can toggle at `/dashboard/notifications` are Push, Email, Telegram and Discord. ### Webhooks Two separate paths: 1. Install the **Webhooks (n8n / Make / Zapier)** addon from [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) — it requires the Unlimited plan — then add your automation URL at `/dashboard/webhooks`. DZBuild posts an HMAC-signed payload the moment an order is created or its status changes. 2. If you're building against the public API, register webhooks with your API key instead — see [Webhooks (API)](https://dzbuild.com/api-docs/webhooks/overview.md). ## Advanced Orders (addon — Unlimited plan) The CRM-style page at [`/dashboard/orders/advanced`](https://dzbuild.com/dashboard/orders/advanced) adds: * **12 sub-statuses** on top of the standard ones: `no answer`, `busy line`, `postponed`, `waiting customer call`, `confirmed`, `cancelled`, `fake`, `duplicate`, `customer cancelled`, `at courier`, `returned`, `completed`. * **Call-attempt tracking** — each attempt is logged with one of five outcomes (no answer, busy, answered, wrong number, callback requested) plus a note, and a red call-count chip shows on the row. * **Full status timeline** per order, with the agent who made each change. * **Team stats** — per-agent activity across the call queue. * **Filter and search** by sub-status. The CRM page does not replace the standard orders page, but it is not read-only either. Eight of the twelve sub-statuses are mapped onto the core order status — confirmed → `confirmed`; cancelled, fake, duplicate and customer cancelled → `cancelled`; at courier → `shipped`; returned → `returned`; completed → `delivered`. Setting one of those also changes the status on the standard orders page, moves stock, updates the customer's fraud score, and fires the normal status-change notifications. The four pre-confirmation states (no answer, busy line, postponed, waiting customer call) have no core equivalent and leave the order status untouched. Activate from [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) (requires the Unlimited plan). ## Tips * **Confirm by phone within 1 hour of the order** when you can — the longer the delay, the more cancellations. * **Don't move orders to `confirmed` unless you've actually verified.** It decrements stock and creates a real shipping intent. * **Use sub-statuses** if your team handles ≥ 50 orders/day — `no answer` callbacks need their own queue. * **Clear out old `pending` orders** weekly. They're usually fake or spam and clutter the list — cancel them one by one from the list, or work through them in the Advanced Orders queue. * **Bind the order detail to a single screen** during call sessions — open it on tablet, dial on phone. * **Send to courier in batches** at the same hour each day so the courier expects a pickup window — up to 50 orders per batch. ## What's next * [Customers](https://dzbuild.com/docs/selling/customers.md) * [Shipping & couriers](https://dzbuild.com/docs/selling/shipping.md) * [Advanced Orders addon](https://dzbuild.com/docs/addons/advanced-orders.md) * [Custom Delivery Label addon](https://dzbuild.com/docs/addons/custom-delivery-label.md) * [Webhooks](https://dzbuild.com/api-docs/webhooks/overview.md) --- Source: https://dzbuild.com/docs/selling/payments.md # Payments This page covers **how customers pay you on your storefront**. The default in Algeria is **Cash on Delivery (COD)**: the customer pays cash when the courier delivers. Digital stores can also accept **manual-receipt** payments (CCP, BaridiMob, RedotPay, custom methods) where the customer uploads a transfer screenshot you verify, and **CIB / Edahabia card** payments that land in your own SlickPay account. DZBuild takes **no commission on your sales**. You pay for your plan and nothing else; whatever the courier or your bank charges is between you and them. Card rails are for merchants paying DZBuild, not for customer checkouts Merchant payments to DZBuild run on two card rails: **SlickPay** (CIB / Edahabia) and **global cards** (Visa / Mastercard / PayPal / Apple Pay, billed in USD). SlickPay covers plan subscriptions, AI credits, paid addons, domain purchases and WhatsApp Sender message top-ups; the global-card rail covers the same purchases. **Neither is wired into your storefront checkout.** The supported customer methods are COD, manual-receipt, `free_digital`, and on Digital-theme stores a CIB / Edahabia card method paid into your own SlickPay account. ## The three customer payment methods Whatever the storefront sends, the server stores one of exactly three values on the order: | `payment_method` | When | | ----------------- | ----------------------------------------------------------------------------------------- | | `cod` | Cash on Delivery — the default, and the fallback for anything else on a physical order. | | `free_digital` | A free digital product (lead magnet, free download). Checkout has no payment step at all. | | `digital_payment` | Manual-receipt or card checkout on a Digital-theme store. | The storefront never offers a fourth option, and if some other value reaches the server from a storefront order it is stored as `cod` (or as `free_digital` when the delivery is digital). Orders created through the [public API](https://dzbuild.com/api-docs/intro.md) are stricter: an unrecognised `payment_method` is rejected with an error rather than quietly corrected, so send one of the three values exactly. ## Card checkout for your customers Your customers cannot pay you by global card on any theme. CIB and Edahabia cards work only on a Digital-theme store, through your own SlickPay account. DZBuild's own two card rails live on your dashboard and sell DZBuild products: plans, AI credits, paid addons, domains and WhatsApp Sender top-ups. Neither can be pointed at your checkout. On a Digital-theme store with the Payment Gateway addon active, you can add the **CIB / EDAHABIA card** method with the public key of your own SlickPay account: the buyer pays by card, the money goes to your SlickPay account, and the order is confirmed and marked paid automatically. On the other themes, card checkout for buyers is planned. No date has been announced, so build those stores around COD for now. ## Cash on Delivery (COD) **Default and most-used payment method in Algeria.** No payment provider is involved at checkout — the customer enters their phone, address and wilaya, and pays cash to the courier on delivery. * **Conversion-friendly.** COD is the trust standard in Algerian commerce. * **There is no COD toggle.** On every theme except Digital, COD is the only customer payment method the checkout accepts — there is nothing to turn off. The choice only exists on Digital-theme stores, where you can offer manual-receipt methods instead; doing that for physical goods aimed at Algerian buyers typically costs a large share of conversions. * **No transaction fees** from any payment provider. * **Cash flow timing.** The courier pays you directly, on its own schedule. DZBuild is not part of that payout, so the cadence is the one in your contract with that courier. ### How the customer experiences COD 1. Customer fills the order form (name, phone, wilaya, city, items). 2. Submits — order arrives in your dashboard as `pending`. 3. You [confirm by phone](https://dzbuild.com/docs/selling/orders.md), the courier delivers, the customer pays cash. This is the path most Algerian merchants live on, and on every theme except `digital`, COD is the **only** built-in customer payment method. ## Manual-receipt payments (Digital Theme only) Manual-receipt checkout is a paid addon — **Payment Gateway, 500 DZD/month** — configured at `/dashboard/digital/payment`. It is mostly used for non-physical products (courses, e-books, digital downloads) where COD doesn't make sense. * Until the addon is active, that page shows only the purchase card and no methods can be saved. * It is bought with a card: CIB / Edahabia via SlickPay, or a global Visa / Mastercard / PayPal card in USD. Paying for it by uploading a CCP or BaridiMob receipt was discontinued in July 2026 and is no longer offered. * The page redirects to your dashboard home if your store theme is not **Digital**. Built-in methods include the **CIB / EDAHABIA card**, paid into your own SlickPay account with no receipt and confirmed automatically once the payment goes through, and these receipt-based ones: * **CCP** (Algeria postal account) * **BaridiMob** (Algerian mobile transfer) * **RedotPay** (USDT / TRC20 wallet) * **Custom methods** you define yourself (BankAccount IBAN, etc.) ### How a manual-receipt payment works 1. The merchant configures one or more payment methods at `/dashboard/digital/payment`. 2. At checkout, the customer picks a method, transfers the money outside the platform, and uploads a screenshot of the receipt. 3. The order arrives with `payment_method = digital_payment`, an order status of `pending`, and a separate `payment_status` that also starts pending. 4. You verify the receipt manually and set `payment_status` to paid. Nothing is auto-verified. Nobody checks that transfer for you. The money moves outside DZBuild, the screenshot is only proof, and the order sits at `pending` until you open it and mark it paid. Make reviewing that queue a daily habit: a customer who has paid and is waiting for a download will chase you, and DZBuild support cannot see or approve a receipt that was uploaded to your store. ### Where to find the receipt Digital orders **do** appear in your normal [Orders](https://dzbuild.com/docs/selling/orders.md) list, but the receipt image is not rendered there. Open **Dashboard → Digital → Orders** (`/dashboard/digital/orders`) and click the order to see it. Verification is a separate field from the order status: you flip `payment_status` from the digital order's detail page, and confirming the order marks it paid automatically. Receipt images are **private**: the dashboard shows them through a temporary link that expires after an hour, so the image URL can't be shared, bookmarked or hotlinked. ### Configuration page Go to **Dashboard → Digital → Payment** (`/dashboard/digital/payment`). You can configure up to **10 methods per store**, each with: * **Name** * **Type**, picked first from a list: CIB / EDAHABIA card, BaridiMob, CCP, Redot Pay, or another method of your own (Custom). The card type asks for your SlickPay public key, with a **Test key** button, instead of account and payment details, and is always in DZD with no receipt. * **Account-holder name** * **Payment details** and **instructions** * **Currency** — DZD, USD or EUR, with a conversion rate for the non-DZD ones * **Receipt required** — yes / no * **Enabled / disabled** * **Logo** — custom methods only; CCP, BaridiMob and RedotPay ship with built-in logos * **Extra fee, expressed as a percentage** (DZD methods only; a USD or EUR method carries no fee) The extra fee is calculated server-side as that percentage of the subtotal after discount, added to the order total, and stored on the order as `payment_fee`. The customer sees the enabled methods on the digital-theme checkout page. ### Digital checkout collects contact channels, not an address Because there is no delivery, the digital checkout asks for contact channels instead of a postal address: **Telegram**, **Instagram**, **WhatsApp**, plus up to three custom fields. Configure them — and mark which are required — at **Dashboard → Digital → Checkout fields** (`/dashboard/digital/checkout-fields`). ## Refunds DZBuild does not automate refunds. Handle them per-method: * **COD** — just cancel the order; no money has been taken. * **Manual receipt** — refund the customer through the original transfer channel (CCP / BaridiMob / etc.), then mark the DZBuild order as `cancelled` or `returned`. **Stock consequence:** moving an order to `cancelled` or `returned` yourself returns its items to stock whenever they had been deducted. A return reported by the courier puts the items back only once the parcel is back with you: when the courier confirms it, when you press **Return received** on the order, or 15 days after the return started. By default stock is deducted at confirmation, not at order placement, so cancelling an order that is still `pending` changes nothing, because nothing was reserved. A store set to deduct on receipt (Orders page, display settings gear, **Stock deduction**) gets the items back on cancellation even from `pending`. ## Frequently asked **Q: I want to filter out fake orders by requiring prepayment.** A: For physical-product stores there is no prepayment option today — most merchants combat fake orders with the [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md) and [Limit Orders Per IP](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) addons, plus phone-confirmation in [Advanced Orders](https://dzbuild.com/docs/selling/orders.md). **Q: Can I accept BaridiMob / CCP transfers?** A: Yes, but only on **Digital Theme** stores via the manual-receipt flow described above. On other themes there is no receipt upload and no paid flag on the order: if a customer transfers money to you outside DZBuild, record it yourself, for example in the order's **Seller notes**. **Q: When are SlickPay and the global-card rail involved?** A: Only when **you (the merchant)** pay DZBuild: to subscribe to a plan, top up AI credits, activate a paid addon, buy a domain or top up WhatsApp Sender messages. SlickPay handles CIB / Edahabia, and the global-card rail handles Visa / Mastercard / PayPal / Apple Pay in USD. Both checkouts are created on your dashboard, never on your storefront. Separately, a Digital-theme store can take CIB / Edahabia cards from its buyers through your own SlickPay account, added as a payment method under **Dashboard → Digital → Payment**. **Q: A customer paid via BaridiMob but my dashboard order is still `pending`.** A: That's expected. Manual-receipt orders start with order status `pending` and `payment_status` pending, and stay that way until you open the order under **Dashboard → Digital → Orders**, check the screenshot, and mark it paid. There is no auto-verification. ## Tips * **Keep COD on Algerian-targeted stores.** On non-Digital themes you couldn't remove it if you wanted to; on a Digital-theme store selling physical goods, replacing COD with manual-receipt only typically costs a large share of your conversions. * **For digital products, lean on manual-receipt** — Algerian customers are familiar with CCP and BaridiMob and trust them as long as your account info is clear. * **Show the receipt-account info clearly** in your storefront's payment instructions. The fewer questions the customer has to ask, the higher the success rate. * **Verify receipts within 24 hours** — the customer expects the digital download (or fulfilment) to start once they've sent the proof. * **Use [Captcha Protection](https://dzbuild.com/docs/addons/captcha-protection.md)** to stop bot-generated COD orders before they reach your phone-confirmation queue. ## What's next * [Orders](https://dzbuild.com/docs/selling/orders.md) — once a payment lands (or a COD order is placed), this is where you act on it. * [Customers](https://dzbuild.com/docs/selling/customers.md) — manage repeat buyers and ban bad actors. * [Captcha Protection addon](https://dzbuild.com/docs/addons/captcha-protection.md) * [Limit Orders Per IP addon](https://dzbuild.com/docs/addons/limit-orders-per-ip.md) --- Source: https://dzbuild.com/docs/selling/products.md # Manage products Open [Dashboard → Products](https://dzbuild.com/dashboard/products) to find, edit and preview your products. | I want to… | Follow this guide | | ---------------------------------- | ----------------------------------------------------------------------------------------------------- | | Add a new product | [Add your first product, with screenshots](https://dzbuild.com/docs/getting-started/first-product.md) | | Add colours, sizes or combinations | [Variants and combinations](https://dzbuild.com/docs/selling/variants.md) | | Enter quantities or restock | [Stock Management](https://dzbuild.com/docs/addons/stock-management.md) | ## Video [Products in DZBuild](https://www.youtube.com/embed/o5rHtd_Pgus) ## Find and edit a product 1. Open **Products**. 2. Search for the product or use the category and status filters. 3. Open **Edit** on its card. 4. Change the needed fields and save. 5. Reopen the product to check the change. Use **Preview in store** to see the buyer's page, or **Share** to copy its link. ## Change photos In the product editor, add your new photos and wait for their thumbnails. ![A photo in the real product uploader with its primary-image badge](/assets/images/fr-product-image-0759b9131f068c931d9a8a54688f3a4e.png) This is the French dashboard. **Principale** means the main photo. * Select a photo's **star** to make it the primary photo. * Drag the other photos into order, or use their arrow buttons. * On a phone, hold a thumbnail briefly before dragging. * Remove a photo only when you no longer want it in the product. A product must keep at least one photo, and on the Free plan it can hold up to 8. Save, then preview the product. If a variant needs a particular photo, [link that option to the image](https://dzbuild.com/docs/selling/variants.md#click--gallery-scroll). ## Write the description Describe what the buyer gets: material, dimensions, included items and available sizes. Use short paragraphs or a short list. The toolbar lets you format text, insert links and add media. To add a description image, use its image button, paste a copied image, or drop an image file into the editor. Each description image can be up to 2 MB. To add a video, press the video button. Under **Upload video**, choose an MP4, WebM or MOV file of up to 50 MB. Under **Video link**, paste a YouTube or Vimeo link, or a Facebook embed link that starts with `https://www.facebook.com/plugins/`, then press **Insert video**. Other links are refused, TikTok included. Use **Preview** to check the description before saving. The description generator is optional. ## Update prices | Field | What to enter | | ----------------- | ---------------------------------------------------------------------------------------- | | **Price** | The selling price paid by the buyer. | | **Compare price** | The previous price displayed crossed out. Leave empty without a discount. | | **Cost** | Your purchase cost. It is not displayed to buyers. Only the store owner sees this field. | | **SKU** | Your own reference code for finding and identifying the product. | The compare price must be higher than the selling price. For a variant that costs more, enter a [price difference](https://dzbuild.com/docs/selling/variants.md), not the full price again. ## Choose the right stock field Use one of these approaches: * One quantity for the product: turn on **Track stock** and enter the available quantity. * One quantity per option: use **Track variant stock**. * One quantity per colour and size together: use **Track combination stock**. ![Price 2500 DA and simple stock tracking with quantity 20](/assets/images/fr-product-stock-24ec5950e6a78f19da4139db05cea080.png) When variant or combination stock is on, product-level stock entry is disabled. Follow [the combination example](https://dzbuild.com/docs/selling/variants.md#stock-modes) to fill the right fields. To choose whether orders deduct stock at confirmation or as soon as they arrive, use **Orders → Display settings → Stock deduction**. See [Stock Management](https://dzbuild.com/docs/addons/stock-management.md). ## Choose a category and status Select the categories that help buyers find the product. You can create categories from **Dashboard → Categories**. | Status | Use it when | | --------------------- | -------------------------------------------- | | **Active** | The product is ready to appear in the store. | | **Active but hidden** | You want to sell it through its direct link. | | **Draft** | You are still preparing it. | A hidden product is still buyable by link. Use Draft if it should not be published. ## Organise products into categories Open **Dashboard → Categories** and press **Add a new category**. Enter the **Category name**, and if you want, a short **Description** and a **Category image** (PNG, JPG or WEBP, up to 5 MB). Press **Add category** to save. A new category starts as **Active**. | Field | What it does | | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Parent category** | Keep **None (main category)** for a main category, or pick a main category to make this one its subcategory. Only main categories are listed, so subcategories go one level deep. | | **Show subcategories section** | Shows this category's subcategories as picture tiles on its page in your store. It is on by default and disappears once you pick a parent. | | **Status** | Appears on the edit screen: **Active** or **Disabled**. A disabled subcategory is left out of its parent's tiles. | To change a category, press **Edit** on its card, make your changes and press **Save changes**. You can also replace or remove its image there. To change the order, drag a card by its handle on a computer, or use its up and down arrows on a phone or tablet. Main categories move among themselves, and subcategories move inside their parent. The order saves as soon as you drop or move a card, and your store lists categories in that order. The **Subcategories only inside the parent category** switch at the top of the page removes subcategories from your store's home page; they stay visible inside their parent category. When you turn it on, press **Confirm** in the window that opens. While the switch is on, **Show subcategories section** stays on and locked for main categories. To delete a category, press the bin button on its card, then **Delete**. Its products stay in your store but leave this category, and its subcategories become main categories. ## Add a quantity offer In **Offers & bundles**, press **Add offer** and fill in: 1. A title, such as **Pack of 2**. 2. The number of pieces, such as **2**. 3. The **final price for the whole offer**, such as **4,500 DA**. **Pricing mode** is **Fixed offer price** by default, which uses the final price above. **Amount off the total** and **Percentage off the total** start from the product price times the number of pieces and take off the discount value you enter. In every mode, the price differences of the options the buyer selects are added to the offer; with a percentage, they are discounted too. You can also add a compare price, badge, image or free shipping. Check these before saving. Free shipping removes the delivery fee for that offer. If the product has variants, the buyer can choose them for each piece. [Offer Variant Popup](https://dzbuild.com/docs/addons/offer-variant-popup.md) provides a dedicated popup for that selection. ## Fill shipping information when needed Enter the correct weight if your delivery pricing uses it. The **Fragile** setting marks the parcel for couriers that support it. Parcel dimensions and insurance appear for supported linked couriers. Check [Shipping](https://dzbuild.com/docs/selling/shipping.md) for delivery setup. ## Edit several products Select the product cards to show the bulk-action toolbar. You can change categories, prices, stock, status or featured placement. **Bulk stock changes apply to simple product stock.** Products using variant or combination stock, and products with **Track stock** off, are skipped. Update those in their editor or Stock Management. Check the selected products and entered value before applying a bulk change. Deletion is permanent Delete removes a product permanently. Use Draft if you only want to take it off sale while keeping it. A product used by a landing page cannot be deleted: delete that landing page first, or link the page to another product in its settings. ## Import an existing catalogue Open **Products → Bulk import**, choose a file in one of the formats listed on that page, then check the preview before importing. Review the handling of existing SKUs and products without images before starting. Bulk import is not available on the Free plan, and the number of products you can add depends on [your plan](https://dzbuild.com/docs/plans/subscriptions.md). For the Shopify connection, see [Shopify Import](https://dzbuild.com/docs/addons/shopify-import.md). ## Product links and search results The product name, description and primary image help describe the product in search and shared links. There is no separate product SEO panel to fill in. Changing the product name can change its address. After renaming, use **Share** to get its current link and check any ads that use an older link. --- Source: https://dzbuild.com/docs/selling/shipping.md # Shipping DZBuild handles the shape of Algerian shipping out of the box: per-wilaya rates, home delivery vs desk pickup, courier-specific desks, weight surcharges, and a free-shipping toggle. This page walks through the shipping settings, the courier integrations, and the [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) addon for per-product overrides. ## Video [Shipping in DZBuild](https://www.youtube.com/embed/H0cRjgs77VA) ## Two pages, not one In the sidebar, **Shipping settings** opens onto two separate pages: * **Shipping prices** at [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping): the free-shipping toggle, the free-shipping threshold card, the **Desk delivery by commune** switch, the wilaya-mode toggle, *Apply default rates*, *Sync rates from provider*, the bulk-update strip, and the per-wilaya rate table. * **Connect a courier** — [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping): the courier tile grid, the credentials modal, *Test connection*, the default-courier flag, and unlinking. Prices live on the first page; couriers on the second. They are independent — you can price and sell without linking any courier at all. ## Setting your rates ### Per-wilaya pricing Each wilaya has one row with three controls (five inputs): * an **enable switch + price** for home delivery, * an **enable switch + price** for stop desk, * a **delivery duration** in days (customers see this). Turning a switch off removes that delivery option for that wilaya at checkout. warning **Changes are not saved automatically.** As soon as you edit anything, a save bar appears at the bottom of the page showing how many rows changed; press **Save** (or **Discard**). Leaving the page without saving loses the edits. The table shows **10 rows per page** by default (the **Show** selector under it switches to 20, 30 or all) and has a wilaya search box plus an "active only" filter, which is why rows sometimes look missing. The free-shipping threshold has its own Save button on its own card and is saved independently of the rate table. ### Apply default rates and Sync rates from provider You don't type 58 rows by hand. Every new store already starts with default rates pre-filled, and two buttons refill the whole table: * **Apply default rates** (badged *recommended*) — a median grid computed across 7 major Algerian providers (DHD, Anderson Delivery, E48hr Livraison, Packers, OM Express, ZR Express, Zimou). For example Adrar at 1150 DZD home / 800 desk, Alger at 475 / 325. * **Sync rates from provider**: calls a linked courier's API with your credentials and imports its price grid into your table. The button only shows once you have linked a courier that supports it (MDM Express and Near Delivery do not), with a picker when several do. For Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua and We Can Services, set your store's wilaya in the store settings first. Both buttons overwrite existing prices. **Apply default rates** rewrites all 58 wilayas and also resets every delivery duration to 3 days; a provider sync rewrites only the wilayas the courier returns a price for and keeps your delivery durations. A provider sync writes into your own store-wide table; it does not create a per-courier price set. ### Bulk update The bulk strip above the table applies one home price, one desk price and one delivery duration to **all** wilayas at once, or only to the rows you ticked in the table's first column; a field you leave empty is not changed. It is the fastest way to set a floor ("600 home / 400 desk / 3 days everywhere") before adjusting the south by hand. ### Wilaya system DZBuild supports two wilaya lists: * **58 wilayas** — the default, marked *Recommended*, because that is what the couriers' own APIs use. * **69 wilayas** — adds the newer delegated wilayas, for merchants who deliver themselves. The 69-wilaya button is disabled while a courier is linked, with a red notice telling you to unlink the courier first. Linking a courier does not move a store that is already in 69-wilaya mode back to 58, so press the **58 wilayas** button yourself before you start sending orders: the courier APIs only know the 58. ### Free shipping The two free-shipping options are **mutually exclusive**: switching on store-wide free shipping greys out the threshold card entirely. * **Free shipping (whole store)** — every order ships free. Use sparingly, usually for a launch campaign or a 24-hour promo. * **Free shipping above a threshold**: type a threshold (for example `5000`) and save it with the button on that card. The threshold is compared against the merchandise **subtotal** (shipping excluded) and is **inclusive**: an order exactly equal to the threshold ships free. A threshold of `0` means the feature is off, not "everything free": every order is still charged from your rate table. Clear the field instead of saving a `0`, because with `0` saved the classic checkout page can still show a free-shipping badge while the customer is charged shipping normally. A special offer can also carry its own free-shipping flag, which zeroes shipping regardless of the threshold. Customers below the threshold see a progress bar on the checkout page and in the fast-checkout forms (not on every theme's product page). The threshold is one of the highest-leverage cart-size boosters — it nudges customers to add a second item. ### Heavy orders A weight surcharge is added automatically on top of your wilaya rate: * The first **5 kg of the order** are included in your rate. * Every extra kilogram adds **50 DZD**. * In the 13 deep-south wilayas (Adrar, Béchar, Tamanrasset, El Bayadh, Illizi, Tindouf, Naâma, Timimoun, Bordj Badji Mokhtar, Béni Abbès, In Salah, In Guezzam, Djanet) the extra rate is **100 DZD/kg** — but only when the store's default courier is Yalidine, Yalitec or Guepex. A store with no default courier set always gets the 50 DZD rate. It is computed once per order from the cart's total weight, not per line, and is skipped entirely when the order already ships free or is a pickup. The surcharge is the courier's own rule and DZBuild applies it on the courier's behalf, so it cannot be switched off store-wide. Two ways around it on a given product: leave that product's weight field empty, or give the product free shipping with [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md). ## Home delivery, Stop Desk, and Pickup Algerian couriers offer two delivery types, and DZBuild adds a third of its own: * **Home delivery** — courier brings the parcel to the customer's door. Higher price. * **Stop desk** — customer picks up from a courier's office. Cheaper, faster, fewer no-shows. You can offer **both** and let the customer choose at checkout. To enable a structured desk picker (with desk name, address, phone), install [Stop Desk Selector](https://dzbuild.com/docs/addons/stop-desk.md). Once a courier is linked, the **Desk delivery by commune** switch (on by default) decides where the desk option shows. When it is on, customers see it only in communes where your courier has a desk. When it is off, they see it in every commune of the wilaya and collect the parcel from the courier's desk in that wilaya. With no courier linked, your wilaya rows decide. While Stop Desk Selector is active the switch does not apply, because the customer picks the desk from the list. A change shows on your storefront within 5 minutes. A third option, **Pickup from Store**, is available as an addon on the Unlimited plan: define your pickup points, and customers in those wilayas get a collect-in-store option. Shipping is always 0 for those orders. It isn't available on the digital theme. ## Linking a courier Open [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping). DZBuild ships **102 courier tiles** and integrates directly with each one, so you can send orders from one screen and get tracking back automatically: | Family | Couriers | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Yalidine family | Yalidine (`yalidine`), Yalitec (`yalitec`), Guepex (`guepex`), Easy & Speed (`easyandspeed`), Economiqua (`economiqua`), We Can Services (`wecan`) | | Standalone | Noest (`noest`), Maystro (`maystro`), ZR Express (`zrexpressnew`), Abex Express (`abexexpress`), Zimou Express (`zimou`), Colivraison (`colivraison`), Ecom Delivery (`ecomdelivery`), Elogistia (`elogistia`), Leopard Express (`leopardexpress`), Colilog Express (`colilog`), Flash Delivery (`flashdelivery`), Near Delivery (`neardelivery`), MDM Express (`mdm`) | | Ecotrack-powered | **82** named couriers, each with its own tile — DHD, Conexlog, MSM Go, Rex Livraison, WorldExpress, Med Express, Colireli, PDEX, Anderson Delivery, OM Express, Packers, … | | Anything else on Ecotrack | **Custom Ecotrack** — paste the `https` API URL your courier gave you | ZR Express is a single merged tile; credentials issued on the old platform are still accepted. Ecotrack is not a courier you link directly; it is the shared API behind those 82 tenant tiles. Procolis likewise is the shared API behind Abex Express, Leopard Express, Colilog Express and Flash Delivery (and behind old-platform ZR Express credentials), not a tile of its own. To link a courier: 1. Sign up directly with the courier and get your API credentials (each courier issues these from their own dashboard). 2. Click the courier's tile on [`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping). 3. Fill the credential fields; the modal shows the right labels for the courier you picked. Roughly: the 82 Ecotrack-powered couriers, plus Maystro, Zimou, Elogistia and MDM Express, take **one** token or key; Yalidine, Yalitec, Guepex, Easy & Speed, Economiqua and We Can Services take an **API ID + Token**; ZR Express takes an **API Key + Tenant ID**; Abex Express, Leopard Express, Colilog Express and Flash Delivery take a **Token + Key**; Noest takes an **API Token + User GUID**; Near Delivery takes an **API Key + API Secret**; Colivraison and Ecom Delivery take two keys; **Custom Ecotrack** also needs a display name and the `https` API URL your courier gave you. 4. Save, then run **Test connection** — a green badge means the credentials are valid. Stored keys are masked when you reopen a tile. Leaving a credential field blank keeps the existing key rather than wiping it. A separate per-courier page in the docs covers each integration's specifics. Start with the [Couriers overview](https://dzbuild.com/docs/couriers/overview.md). ### Express vs Économique Guepex offers an **Économique** tier that you select when you link it. Yalidine, Yalitec and Easy & Speed reject that parameter outright (the order would fail to send), which is why the selector only appears for Guepex — everyone else always ships Express. ### Default courier You can link as many couriers as you like. Mark one as **default**: it is preselected in the per-order send dropdown (shown there with a ⭐) and in the bulk-send bar. You can still switch courier per order or per batch. ### Refresh provider data DZBuild keeps its own copy of each linked courier's wilayas, communes and desk list, refreshed automatically. That copy is what feeds the checkout desk picker and the "no desk in this wilaya" send block. Just linked a courier and don't want to wait? Click **Refresh provider data**. Each tile shows its synced coverage — number of desks across how many wilayas, and when it last synced. After linking, orders get a **Send to delivery** button — see [Orders](https://dzbuild.com/docs/selling/orders.md). ## Per-product shipping (Custom Product Shipping addon) When you have a heavy item (a bicycle, a fridge) that doesn't fit your standard rate, the **Custom Product Shipping** addon lets you set per-product shipping rules: * Flat rate per product (overrides the store rate when this product is in the cart). * Per-wilaya pricing for the product. * Free shipping on a specific product. * Highest-price-wins for mixed carts (so the heavier item dictates). Activate from [`/dashboard/addons`](https://dzbuild.com/dashboard/addons) (requires the Pro plan). See the [Custom Product Shipping](https://dzbuild.com/docs/addons/custom-product-shipping.md) doc for the full setup. ## Delivery labels Print a label from the printer icon on any order. If the order has already been sent to an Ecotrack-powered courier or Elogistia **and has a tracking number**, DZBuild fetches that courier's own PDF bordereau. For every other courier — and for orders not yet dispatched — DZBuild prints its own sheet: * store name and phone, * customer name, phone and address, * the item list with quantities and line prices, * subtotal / shipping / total (the total is the COD amount), * the tracking number when there is one, * a QR code that reopens the order in your dashboard. The DZBuild sheet does not carry your store logo. On mobile — and on desktop when the popup is blocked — it renders inline instead of opening a print window. Couriers cap the product-description field they accept (100 to 255 characters depending on the courier), so long carts are shortened automatically on the courier's own label: variant suffixes are dropped first, then items collapse to a "+N" count, and in the worst case the first product name is cut short and followed by that count. If you need specific wording on the label, keep product names short. For per-product label customisation (rename items, hide variants, add custom text), install [Custom Delivery Label](https://dzbuild.com/docs/addons/custom-delivery-label.md). ## What customers see at checkout 1. Customer enters wilaya + city in the checkout form. 2. Storefront shows: `Shipping to {wilaya}: {home_price} DZD` or a desk picker. 3. Total updates live as they pick home / desk. 4. On submit the order stores the delivery type (`home`, `desk` or `pickup`), the shipping cost, wilaya, commune and address — plus the desk id and desk name when the Stop Desk Selector addon picked a specific desk. Those are the fields handed to the courier when you send the order. The shipping price is always recalculated from your rate table when the order is submitted, so a value tampered with in the browser is ignored. ## What happens after you send DZBuild re-reads every dispatched order's status from its courier automatically and updates the order, so delivered and returned orders move on their own. A change on the courier's side can take a little while to show up. When the courier reports a return, the order turns `returned` but its items go back to stock only once the parcel is back with you: when the courier reports that you received it, when you press **Return received** on the order (or tick several orders and use **Returns received** on the orders list), or 15 days after the return started. An unrecognised courier status is left alone rather than guessed. A shipment the courier reports as "not found" is never auto-cancelled: DZBuild treats it as a transient error, retries later, and leaves the order exactly as it is. Only an explicit cancelled status from the courier moves the order to `cancelled`. ## Frequently asked **Q: A customer says delivery to their wilaya is wrong — why?** A: Open [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping), find that wilaya's row, check the home / desk numbers — and remember to press **Save** if you change them. The number in that table is what the storefront shows, plus any weight surcharge. **Q: Can I have different rates for different couriers?** A: No. Your shipping prices are stored once per wilaya for the whole store, and the customer is charged from that table no matter which courier you later hand the order to. You can *import* one courier's price grid into your table with **Sync rates from provider**, but the imported prices then apply store-wide. For different prices on specific items, use Custom Product Shipping. **Q: Free shipping above X DZD — does it apply to home + desk?** A: Yes, both. The total compared against the threshold is the merchandise subtotal (excluding shipping itself), and the comparison is inclusive. **Q: "Send to delivery" says there is no desk in this wilaya.** A: That's DZBuild's own check against the courier's synced desk list, not a courier rejection. Either the courier genuinely has no desk there, or the synced data is stale — click **Refresh provider data**, or change the order to home delivery. ## Tips * **Save before you leave the rates page.** The save bar at the bottom is the only thing that persists your edits. * **Check southern wilaya rates regularly** — couriers raise these without much notice. Part of the south is already handled for you by the automatic weight surcharge, so don't double-charge for it. * **Set the free-shipping threshold \~30% above your average order**. It nudges 1-item buyers to add a second. * **Keep desk prices \~200 DZD below home prices.** Customers will pick desk when the gap is visible. * **Run Test connection** after linking a courier — green is your green light to send orders. * **Don't link a courier you haven't signed up with.** API credentials must come from the courier's own dashboard, not a guess. * **Use Custom Product Shipping** for heavy items — store rates always undercharge for fridges and TVs. ## What's next * [Couriers overview](https://dzbuild.com/docs/couriers/overview.md) * [Stop Desk Selector addon](https://dzbuild.com/docs/addons/stop-desk.md) * [Custom Product Shipping addon](https://dzbuild.com/docs/addons/custom-product-shipping.md) * [Custom Delivery Label addon](https://dzbuild.com/docs/addons/custom-delivery-label.md) --- Source: https://dzbuild.com/docs/selling/variants.md # Add variants and combinations A **group** is a choice such as Colour or Size. An **option** is one value, such as Green or 40. A **combination** is one option from each group, such as Green + 40. This tutorial continues the [first product](https://dzbuild.com/docs/getting-started/first-product.md): sports shoes at **2,500 DA**. It uses real French dashboard screenshots with demonstration values. ## Video [Variants & combinations — new variants system in DZBuild](https://www.youtube.com/embed/eb9YPb4UT5s) ## 1. Add the colour group Open your product from **Dashboard → Products → Edit** and scroll to **Variants** (*Variantes*). 1. Press **Add group** (*Ajouter un groupe*). 2. Name the group **Colour** (*Couleur* in the example). 3. Choose the **Colour** type before filling the options. 4. Name the first option **Green** and choose its colour. 5. Press **Add option** (*Ajouter une option*) and add **Black**. The first option row appears automatically when you add a group. ## 2. Add the size group 1. Press **Add group** again. 2. Name it **Size** (*Pointure* in the example). 3. Keep the **Text** type. 4. Enter **40** in the first option. 5. Press **Add option** and enter **41**. ![Two real variant groups, Colour and Size, with two options each](/assets/images/fr-variants-f95c7dd52c0fc8b87e0ff57c0fe9abe6.png) **Check:** there are two groups, each with two options. Your buyer will choose one colour and one size. Choose the type first Changing a group's type can clear its option rows. Pick Colour or Text before entering the option names. ## 3. Set a price difference Leave the option's price difference at **0** when it uses the product's normal price. If size 41 costs **2,700 DA** and the product price is **2,500 DA**, enter **200** beside size 41. The screenshot above shows this example. **2,500 + 200 = 2,700 DA.** Do not enter 2700 as the difference. Price differences from selected options are added to the product price. ## 4. Choose how to count stock | Your situation | Stock mode | | --------------------------------------------------- | -------------------------------------------------------------- | | You have one quantity for the whole product | **Track stock** (*Suivi du stock*) | | You count each option separately, such as each size | **Track variant stock** (*Suivi du stock des variantes*) | | You count each colour and size together | **Track combination stock** (*Suivi du stock par combinaison*) | For option stock, turn on **Track variant stock** in **Pricing & stock**, then fill the stock beside each option. Leave combination stock off. For our shoes, use **combination stock**: Green + 40 and Green + 41 have different quantities. ## 5. Create the combination table With both groups filled in: 1. In **Pricing & stock**, turn on **Track variant stock**. 2. Turn on **Track combination stock**, which now appears. 3. Scroll to **Combination stock table** (*Tableau de stock des combinaisons*). ![Variant and combination stock enabled in the product editor](/assets/images/fr-combination-switches-ab682486a73f41f50af23f79f6c1e4ec.png) The table is generated when you enable the switch. **Generate combinations** (*Générer les combinaisons*) rebuilds it after you change the groups. Review every quantity after rebuilding. ![Four combinations with quantities 8, 5, 7 and 0, for a total of 20 pairs](/assets/images/fr-combinations-b9ef4b8b2faa929c8d05fcf656fbe9cc.png) Enter the quantity you physically have for each pair: | Colour | Size | Stock | Example SKU | | ------ | ---- | ----- | ----------- | | Green | 40 | 8 | SPORT-V40 | | Green | 41 | 5 | SPORT-V41 | | Black | 40 | 7 | SPORT-N40 | | Black | 41 | 0 | SPORT-N41 | A **SKU** is your own reference code. Use a different code for each combination if you need to identify it quickly. **Check:** two colours × two sizes gives **four rows**. Total stock is **20**, and Black + 41 is sold out. ### Zero, blank and the stock switches * **0 means sold out.** Use 0 for a combination you cannot sell. * Do not leave quantities blank when you want a precise stock count. A blank option quantity can mean unlimited stock. * With combination stock on, the per-option fields disappear and product stock is disabled. Edit the combination table instead. * Newly generated rows start at 0. Fill them before saving. ### Set several rows at once Use **Set all stock** (*Définir tout le stock*) to give every row the same quantity. Enter the number and press **Apply** (*Appliquer*). To update just one colour, use the condition controls, such as **Colour = Green**, enter the quantity and press their **Apply** button. These set the quantity of each matching row; they do not add units to its previous quantity. Review the rows before saving, especially after a bulk change. ## 6. Save and check Save the product. Reopen it and confirm the table still shows **8, 5, 7 and 0**. When the product is published, preview it in the store. Choose a colour and size, check the price, and check that the sold-out combination cannot be ordered. For later deliveries, use [Stock Management](https://dzbuild.com/docs/addons/stock-management.md) to update the right combination. ## Other option types | Type | Use it for | | ------------------- | ----------------------------------------------------------- | | **Colour** | A colour swatch. | | **Text** | Sizes, capacity or material names. | | **Image with text** | An option shown with a picture and label. | | **Multiple choice** | Optional extras where the buyer may select several options. | | **Dropdown** | A list the buyer opens to choose one option. | Colour, Text, Image-with-text and Dropdown groups ask the buyer to choose one option. Multiple-choice groups are optional and do not appear in the combination table. ### Link an option to a photo Upload the product photos first. On a colour or image option, press **Image**, then choose the matching product photo. For a colour option, **Image card** (*Carte image*) shows a larger card when a photo is linked. Image-with-text options already use cards. A multiple-choice option can also take a photo with **Image**; it shows on that option's card and does not change the gallery photo. On a carousel, selecting a linked option changes the displayed photo. In a stacked gallery, phones keep the buyer at the options instead of scrolling back up. ### Arrange your photos The primary photo stays first. Select another photo's star to change it. Reorder the other photos with drag-and-drop or the arrow buttons; on a phone, hold a thumbnail briefly before dragging. ## If you get stuck | Problem | What to check | | ---------------------------------- | ----------------------------------------------------------------------------------------------------- | | Combination switch missing | Add two groups and turn on variant stock first. | | Table is empty | Give the groups and their options names. Multiple-choice groups do not count toward the table. | | Every combination is sold out | New rows start at 0. Enter your quantities and save. | | Wrong price after selecting a size | Enter the price difference, not the final selling price. | | One choice looks dimmed | It may be available with another choice. Select it, then choose the remaining option again if needed. | | Too many combinations | Keep the table at 1,000 combinations or fewer. Reduce the number of options or split the product. | ## Related guides * [Dependent choices, such as brand then model](https://dzbuild.com/docs/addons/cascading-variants.md) * [Variant selection for multi-item offers](https://dzbuild.com/docs/addons/offer-variant-popup.md) * [Digital Product Variants](https://dzbuild.com/docs/addons/digital-product.md) * [Manage product information and images](https://dzbuild.com/docs/selling/products.md) --- Source: https://dzbuild.com/docs/storefront/custom-css-guide.md # Custom CSS guide Custom CSS lets you fine-tune the look of your storefront beyond the customizer's built-in controls — rounder buttons, softer card shadows, a custom font, a sticky header, and much more. This guide is a complete, beginner-friendly walkthrough: how CSS works, where to paste it, the DZBuild selector cheat-sheet, and **dozens of ready-to-paste templates**. Enterprise feature Custom CSS is available on the **Enterprise** plan. On other plans the field shows as locked. See [plans](https://dzbuild.com/docs/plans/enterprise.md) to upgrade. ## Where to paste it Sidebar **Personnaliser la boutique / تخصيص المتجر** → **Personnaliser / تخصيص** → **CSS personnalisé / CSS مخصّص**. Type or paste your CSS, watch the **live preview** update on the right, and click **Save** when it looks right. Your CSS loads *after* the theme's main stylesheet, so your rules usually win. A few parts bring their own styles later in the page or on the element itself: the header on every page except product pages, the footer, the floating WhatsApp button, the product page's own styles and, on some themes, the announcement bar. A rule for those needs `!important` to win. You can't break anything permanently Custom CSS only changes appearance — never your products, orders, or data. If the storefront looks wrong, **clear the field and Save** and you're back to normal. Always check the live preview *before* saving. 50 KB limit — silent truncation The field is capped at **50,000 characters**: the box stops accepting text at that point, and the counter under it shows how many you have used. The saved copy is also cut at 50,000 bytes with no error shown, and an Arabic letter counts as two bytes, so CSS that contains Arabic text can lose its end even when the counter is under the limit. A cut can leave a rule half-written and disable everything after it. Keep the stylesheet small, and if the tail of your CSS stops working, check its length first. **Where it applies:** the homepage, product pages, category and all-products pages, cart, checkout, order tracking and the order-confirmation page. It does **not** apply to landing pages at `/landing/{slug}` — those render outside the theme system. ### Check for a built-in switch first Several of the templates below duplicate — and can fight with — a control that already exists in the customizer: | What you want | Built-in control | | ---------------------------------------------------- | ---------------------------------- | | Sticky header, header shadow, header border | Customize → Header & Logo | | Product-card corner radius (0 / 8 / 16 / 24 px) | Customize → Product card | | Hide the grid add-to-cart button or the hover action | Customize → Product card | | Show/hide the announcement bar, and its colours | Customize → Announcement bar (Pro) | | Show/hide the search bar | Customize → Search bar | | Footer colour, hide "Powered by DZBuild" | Customize → Footer | | Buy Now / Fast Checkout button colours | Customize → Product page (Pro) | Use the switch when there is one — it survives theme changes and won't be overridden by a future stylesheet update. *** ## How CSS works (60-second primer) CSS is a list of **rules**. Each rule has a **selector** (what to target) and a **declaration block** (what to change): ``` .add-to-cart { color: white; background: #f59e0b; } /* └─ selector ┘ └───── declarations: property: value; ─────┘ */ ``` * A **selector** points at elements. The most common kinds: * `.classname` — every element with that class (e.g. `.add-to-cart`). **This is what you'll use 95% of the time.** * `tag` — every element of a type (e.g. `button`, `h1`, `img`). * `#id` — the single element with that id. * `.a .b` — a `.b` **inside** an `.a`. `.a > .b` — a `.b` that is a **direct child** of `.a`. * `.a:hover` — an `.a` while the mouse is over it. * A **declaration** is `property: value;`. Common properties: `color`, `background`, `border`, `border-radius`, `padding`, `margin`, `font-size`, `box-shadow`, `display`. * **The cascade**: when two rules touch the same thing, the more *specific* one — or the one loaded *later* — wins. Because your CSS loads after the theme, your `.add-to-cart` rule beats the theme's. * **`!important`** forces a value to win. Use it sparingly — only when a normal rule won't override the theme: ``` .add-to-cart { border-radius: 999px !important; } ``` That's genuinely most of what you need. Everything below is copy-paste. *** ## Finding the right selector You rarely need to guess. Use your browser's inspector: 1. Open your storefront on a **desktop browser** (Chrome, Firefox, Edge). 2. **Right-click** the element you want to change → **Inspect**. 3. In the panel that opens, the highlighted line shows the element and its `class="…"`. Pick a class name (e.g. `product-card`) and target it as `.product-card`. 4. Paste a test rule into the Custom CSS field and watch the **live preview**. tip Selectors differ between themes (Starter, Digital, Brico, Started V2, Prestige, Promobi, Bloom) — hero and search boxes especially. When in doubt, **inspect your own storefront** rather than copying a class blindly, then drop the rule into the preview to confirm. *** ## DZBuild selector cheat-sheet The most useful, stable selectors across themes: | Selector | Targets | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `.navbar-store` | The top header / navigation bar, shared by every page (the same element also carries `id="navbar"`, so `#navbar` works too). The Promobi homepage has its own header, `.pm-nav` | | `.announcement-bar` | The thin promo strip above the header. On the Promobi homepage the announcement scrolls in a `.pm-marquee` strip instead | | `.product-card` | A single product tile in any product grid | | `.product-image` | The **wrapper** around a product-card image — target `.product-image img` for the picture itself | | `.product-price` | The price text on a product card | | `.product-actions` | The hover action buttons on a product card (hidden on touch devices — see below) | | `.add-to-cart` | "Add to cart" / buy buttons in product grids | | `.whatsapp-float` | The floating WhatsApp button. Once you save the settings in Customize → Help widget, the button becomes `.dzhw-launcher` instead | | `.footer` | The page footer on every page, except the **Brico homepage**, which uses `.brico-footer` | Three selectors that circulate in older snippets **do not work** on DZBuild storefronts: * `.btn-primary` — exists only on the order-confirmation page, nowhere else. To recolour the Buy Now and Fast Checkout buttons, use the built-in pickers (Customize → Product page) or the CSS variables below. * `.header-search`: no storefront markup uses it. The shared navbar has no search box at all, so a header-search rule can never work on the product, cart, category or checkout pages. Search is **theme-specific and homepage-only**: `.brico-search`, `.sc-search` (Started V2 and Bloom), `.pr-search`, `.pm-search`, `.search-section` (Starter and Digital). * `.hero` — the real hero classes are theme-specific too: `.hero-section` (Starter), `.dt-hero-section` (Digital), `.sc-hero` (Started V2 and Bloom), `.pr-hero` (Prestige), `.pm-hero` (Promobi). Brico has no hero. ### Brand CSS variables Declared by all 7 active themes: | Variable | Controls | | --------------- | ------------------------------------------ | | `--primary` | Primary brand color | | `--secondary` | Secondary color | | `--gradient` | Primary→secondary gradient (buttons, hero) | | `--btn-radius` | Button corner roundness | | `--card-border` | Product-card border | | `--card-shadow` | Product-card shadow | Page background differs by theme: **Starter and Digital** use `--background`; Bloom, Brico, Prestige, Promobi and Started V2 use `--bg` (plus `--navbar-bg` and `--border-color`, and `--footer-bg` on all of them except Promobi). When in doubt, set both. Product-page buttons read their own variables. When you pick the matching colour in Customize → Product page, the page sets these variables itself after your Custom CSS, so the picker wins; a value set here only applies while that picker is empty: | Variable | Controls | | ------------- | ------------------------------------------------------------------ | | `--pd-buynow` | Buy Now button colour (`--pd-buynow-hover` for hover) | | `--pd-fc-btn` | Fast Checkout submit-button colour (`--pd-fc-btn-hover` for hover) | For a store-wide colour change, use the primary and secondary colour pickers in **Customize → Colours & font**: they reach every page, product pages included. The variables below only reach the pages that read them: the theme homepages, cart, checkout, category, all-products and order-tracking pages. Product pages use their own colour variables, the Promobi homepage reads `--accent` and `--accent2`, and several pages build `--gradient` from the saved colours, so set it as well. ``` /* Re-colour the pages that read these variables */ :root { --primary: #6d28d9; --secondary: #a78bfa; --gradient: linear-gradient(135deg, #6d28d9 0%, #a78bfa 100%); --accent: #6d28d9; --accent2: #a78bfa; --btn-radius: 12px; --background: #faf7f2; --bg: #faf7f2; } ``` *** ## Templates Copy any block into the Custom CSS field. Mix and match. ### Buttons These target `.add-to-cart`, the buy button on product-grid tiles. For the **Buy Now** and **Fast Checkout** buttons on the product page, set `--pd-buynow` / `--pd-fc-btn` (or use the colour pickers in Customize → Product page) rather than chasing a class. ``` /* Pill (fully rounded) buttons */ .add-to-cart { border-radius: 999px; } /* Gradient buttons with a subtle lift on hover */ .add-to-cart { background: linear-gradient(135deg, #f59e0b 0%, #f97316 100%); border: none; transition: transform .15s ease, box-shadow .15s ease; } .add-to-cart:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(245, 158, 11, .35); } /* Outline style */ .add-to-cart { background: transparent; color: #f59e0b; border: 2px solid #f59e0b; } .add-to-cart:hover { background: #f59e0b; color: #fff; } ``` ### Product cards ``` /* Soft shadow + rounded corners */ .product-card { border-radius: 16px; box-shadow: 0 8px 24px rgba(0, 0, 0, .08); overflow: hidden; } /* Lift the card on hover */ .product-card { transition: transform .2s ease, box-shadow .2s ease; } .product-card:hover { transform: translateY(-4px); box-shadow: 0 14px 32px rgba(0, 0, 0, .12); } /* Gentle zoom on the product image on hover */ .product-card:hover .product-image img { transform: scale(1.04); } .product-image img { transition: transform .3s ease; } /* Make the price bigger and bolder */ .product-price { font-size: 1.15rem; font-weight: 800; } ``` Hover effects are switched off on phones — leave them off Every theme ships `@media (hover: none) and (pointer: coarse)` overrides marked `!important` that neutralise `.product-card:hover` transforms and hide `.product-actions`. This is deliberate: the whole card is clickable, and on iOS an active hover state eats the shopper's **first tap**, so the product stops opening on the first touch. Don't force hover styles back on for touch devices. ### Header & navbar ``` /* Header shadow */ .navbar-store { box-shadow: 0 2px 12px rgba(0, 0, 0, .06) !important; } /* Solid brand-colored header */ .navbar-store { background: #111827 !important; } ``` Sticky header, header shadow and header border already have switches in **Customize → Header & Logo**: use those first; they survive theme changes. Use the switch for a sticky header: a `position` rule here does nothing on most pages, and with `!important` it can leave a gap under the header on phones. ### Announcement bar ``` /* Eye-catching gradient announcement bar */ .announcement-bar { background: linear-gradient(90deg, #f59e0b, #ef4444) !important; color: #fff !important; font-weight: 600 !important; letter-spacing: .3px; } ``` ### Fonts & typography Custom CSS supports `@import`, so you can load a Google Font and apply it everywhere. Put the `@import` line **at the very top** of the field. Fonts from Google Fonts load; stylesheets and fonts from most other font services are blocked by the storefront's security policy. ``` /* Load Google Fonts and use them across the store */ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Sora:wght@600;800&display=swap'); body { font-family: 'Poppins', sans-serif; } /* A different, heavier font just for headings */ h1, h2 { font-family: 'Sora', sans-serif; letter-spacing: -.5px; } ``` Remember the 50 KB cap: a long list of `@import` lines plus a big stylesheet can hit it and be silently truncated. Arabic stores For Arabic storefronts, pick a font with full Arabic glyph coverage — **Cairo**, **Tajawal**, or **Almarai** all work well: `@import url('https://fonts.googleapis.com/css2?family=Tajawal:wght@400;700&display=swap');` ### Hero There is no shared `.hero` class — swap in your theme's hero selector: `.hero-section` (Starter), `.dt-hero-section` (Digital), `.sc-hero` (Started V2, Bloom), `.pr-hero` (Prestige), `.pm-hero` (Promobi). The example below uses Starter's. ``` /* Darken the hero so overlaid text stays readable */ .hero-section::after { content: ""; position: absolute; inset: 0; background: rgba(0, 0, 0, .35); } .hero-section h1 { position: relative; z-index: 1; text-shadow: 0 2px 12px rgba(0,0,0,.4); } ``` ### Footer ``` /* Dark footer with brand-colored link hovers */ .footer { background: #0f172a !important; color: #cbd5e1 !important; } .footer a { color: #cbd5e1 !important; transition: color .15s ease; } .footer a:hover { color: #f59e0b !important; } ``` note `.footer` covers every page except the **Brico homepage**, which renders its own footer: use `.brico-footer` there, next to `.footer` for Brico's other pages. Footer colour also has a built-in picker (Customize → Footer, Pro+). ### Mobile-only tweaks Wrap rules in a `@media` query so they only apply on small screens: ``` @media (max-width: 768px) { /* Bigger, easier-to-tap buttons on phones */ .add-to-cart { padding: 14px 18px; font-size: 1rem; } /* Softer card corners on phones */ .product-card { border-radius: 12px; } } ``` Two things people try here that don't work: * **Hiding the search box.** There is no shared search class; search is homepage-only and theme-specific (`.brico-search`, `.sc-search`, `.pr-search`, `.pm-search`, `.search-section`). The customizer has a **Search bar** show/hide switch: use that instead. * **Forcing a two-column product grid.** Homepage product grids are already two-up on mobile: Bootstrap columns (`col-6 col-md-4 col-lg-3`) on most themes, `.pm-grid` on Promobi. The all-products and category pages use `.products-grid`. `.product-grid` is the **product-detail** page's gallery + info wrapper: retargeting it squeezes the gallery and the info column side-by-side on phones and does nothing to the homepage. ### Hide things you don't want ``` /* Hide the floating WhatsApp button (or switch it off in Customize → Help widget) */ .whatsapp-float, .dzhw-launcher { display: none !important; } /* Hide the announcement bar */ .announcement-bar { display: none; } ``` warning Never hide your **Buy / Add to cart** buttons (`.add-to-cart`, the Buy Now and Fast Checkout buttons) — that stops customers from ordering. Use the live preview to confirm those stay visible. If you genuinely want them gone on some pages, the customizer has proper switches for it (Customize → Product card and Customize → Product page, Pro+). ### Smooth micro-animations ``` /* Fade everything in nicely on load */ body { animation: dzfade .4s ease both; } @keyframes dzfade { from { opacity: 0; } to { opacity: 1; } } /* Smooth color/shadow transitions everywhere */ a, button, .product-card { transition: all .15s ease; } ``` *** ## Best practices * **Preview before you save** — the right-hand panel updates live as you type. Save only when it looks right. * **Mobile first** — most Algerian shoppers are on phones. Always check the mobile preview *and* a real phone. * **Don't hide critical UI** — keep Buy/Add-to-cart, price, and checkout visible. * **Keep it small** — a few focused rules beat a giant stylesheet, and the field is hard-capped at **50 KB** with silent truncation past that point. * **Use a built-in switch when one exists** — see the table at the top of this page. A customizer setting won't be undone by a theme update. * **Use the colour pickers for brand colours** (Customize → Colours & font): one change re-skins the whole store. The CSS variables (`--primary`, `--gradient`, `--pd-buynow`) only reach the pages that read them, as the variables section above explains. * **Check both languages** — if you sell in Arabic (RTL) and French/English (LTR), preview both so a `margin-left` tweak doesn't break the other direction. * **`@import` goes first** — font imports must be at the very top of the field or the browser ignores them. *** ## Troubleshooting | Symptom | Likely cause | Fix | | ------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | My rule isn't applying | The theme's rule is more specific | Add `!important`, or target more precisely (e.g. `.product-card .add-to-cart`) | | My rule isn't applying | The selector doesn't exist on DZBuild | `.btn-primary`, `.header-search` and `.hero` are the usual culprits — see the cheat-sheet | | Still nothing | Typo in the selector / missing `;` or `}` | Re-check the block; one broken brace can disable the rest | | The end of my stylesheet does nothing | You crossed the 50 KB cap and it was truncated on save | Shorten the CSS | | Change shows in preview but not live | Storefront pages are cached for a few minutes | Wait about five minutes, then hard-refresh (Ctrl/Cmd+Shift+R) or open a private window. There is no manual purge, and a page a visitor already loaded keeps the old CSS until its cached copy expires | | My font won't load | `@import` isn't at the top | Move every `@import` line to the very top of the field | | Nothing changes on my landing page | Custom CSS doesn't apply to `/landing/…` pages | Style the landing page from the landing-page editor | | The store looks broken | A rule went too far | **Clear the field and Save** to revert instantly — nothing is permanent | A stray closing tag can't break your page If a `` or `` string ends up in the field, DZBuild escapes it before it reaches the page, so it can't terminate the stylesheet or inject markup. It is escaped rather than preserved, so don't expect such text to render. *** ## Revert anytime Custom CSS is never destructive. To undo everything, **clear the Custom CSS field and click Save**. Your storefront returns to the theme defaults on the next page load. Your products, orders, and settings are untouched. Want to change layout, colors, fonts, or sections without code? Most of that is built into the visual editor — see **[Storefront customization](https://dzbuild.com/docs/storefront/customization.md)**. --- Source: https://dzbuild.com/docs/storefront/custom-js-guide.md # Custom JavaScript guide Custom JavaScript lets you add behaviour that the customizer has no switch for: a delivery notice on every page, a countdown to the end of an offer, a prefilled WhatsApp message, a back-to-top button. You write the code once in the dashboard and it runs on your storefront for every visitor. This guide covers where to paste it, where it runs, what it cannot do, and a set of snippets you can copy. Enterprise feature Custom JavaScript is available on the **Enterprise** plan. On other plans the section shows as locked. See [plans](https://dzbuild.com/docs/plans/enterprise.md) to upgrade. ## Where to paste it Sidebar **Personnaliser la boutique / تخصيص المتجر** → **Personnaliser / تخصيص** → **JavaScript personnalisé / JavaScript مخصّص**. Paste your code, then click **Save**. Paste JavaScript only. Do not include a `