Ask for a review 2 days after delivery

When Bosta delivers an order, wait two days, then ask the customer for a review on WhatsApp.

Medium Saves ~4 hours/month MENA & local appsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Webhook — Bosta delivery status update
  1. Receive the status update from Bosta.
  2. Continue only when the shipment is delivered.
  3. Wait two days so the customer has tried the product.
  4. Find the customer in your Orders sheet and send a WhatsApp template with your review link.

Diagram

trueBosta updateWebhook{ }Read statusCode⑂Delivered?IfWait 2 daysWaitGFind customerGoogle SheetsWAsk for a reviewWhatsApp Business Cloud
Trigger App Logic Code

Code

JavaScript used in the Code step — already included in the template below.

Read status · Code node
// Mode: Run Once for Each Item
// Bosta delivery webhook → clean fields with a readable status in English and Arabic.
// Confirm the state codes in Bosta's webhook documentation and adjust this map if needed.
const STATES = {
  21: { en: "Picked up", ar: "تم استلام الشحنة من المتجر", kind: "progress" },
  24: { en: "At Bosta warehouse", ar: "الشحنة في مخزن بوسطة", kind: "progress" },
  41: { en: "Out for delivery", ar: "الشحنة خرجت للتوصيل", kind: "progress" },
  45: { en: "Delivered", ar: "تم التوصيل", kind: "delivered" },
  46: { en: "Returned to business", ar: "تم إرجاع الشحنة", kind: "problem" },
  47: { en: "Exception", ar: "مشكلة في التوصيل", kind: "problem" },
};

const b = $json.body || {};
const code = Number(b.state?.code ?? b.state);
const state = STATES[code] || { en: `Status ${code}`, ar: `الحالة ${code}`, kind: "other" };

return {
  json: {
    tracking: b.trackingNumber || "",
    order_id: b.businessReference || "",
    code,
    status_en: state.en,
    status_ar: state.ar,
    kind: state.kind,
    cod: b.cod || 0,
    reason: b.exceptionReason || "",
  },
};

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder.

Workflow JSON
Show code (228 lines)
{
  "name": "Ask for a review 2 days after delivery (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Ask for a review 2 days after delivery\nWhen Bosta delivers an order, wait two days, then ask the customer for a review on WhatsApp.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "bosta-review",
        "options": {}
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Bosta update",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "webhookId": "47157a09-bfe3-4e1d-a09c-20a04769de30"
    },
    {
      "parameters": {
        "jsCode": "// Mode: Run Once for Each Item\n// Bosta delivery webhook → clean fields with a readable status in English and Arabic.\n// Confirm the state codes in Bosta's webhook documentation and adjust this map if needed.\nconst STATES = {\n  21: { en: \"Picked up\", ar: \"تم استلام الشحنة من المتجر\", kind: \"progress\" },\n  24: { en: \"At Bosta warehouse\", ar: \"الشحنة في مخزن بوسطة\", kind: \"progress\" },\n  41: { en: \"Out for delivery\", ar: \"الشحنة خرجت للتوصيل\", kind: \"progress\" },\n  45: { en: \"Delivered\", ar: \"تم التوصيل\", kind: \"delivered\" },\n  46: { en: \"Returned to business\", ar: \"تم إرجاع الشحنة\", kind: \"problem\" },\n  47: { en: \"Exception\", ar: \"مشكلة في التوصيل\", kind: \"problem\" },\n};\n\nconst b = $json.body || {};\nconst code = Number(b.state?.code ?? b.state);\nconst state = STATES[code] || { en: `Status ${code}`, ar: `الحالة ${code}`, kind: \"other\" };\n\nreturn {\n  json: {\n    tracking: b.trackingNumber || \"\",\n    order_id: b.businessReference || \"\",\n    code,\n    status_en: state.en,\n    status_ar: state.ar,\n    kind: state.kind,\n    cod: b.cod || 0,\n    reason: b.exceptionReason || \"\",\n  },\n};",
        "mode": "runOnceForEachItem"
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Read status",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "c1",
              "leftValue": "={{ $json.kind }}",
              "rightValue": "delivered",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Delivered?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "amount": 2,
        "unit": "days"
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Wait 2 days",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        900,
        0
      ]
    },
    {
      "parameters": {
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Orders",
          "mode": "name"
        },
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "order_id",
              "lookupValue": "={{ $('Read status').item.json.order_id }}"
            }
          ]
        }
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Find customer",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1200,
        0
      ]
    },
    {
      "parameters": {
        "operation": "sendTemplate",
        "phoneNumberId": "YOUR_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "={{ String($json.phone).replace(/[^0-9]/g, '') }}",
        "template": "YOUR_REVIEW_TEMPLATE|ar",
        "components": {
          "component": [
            {
              "type": "body",
              "bodyParameters": {
                "parameter": [
                  {
                    "type": "text",
                    "text": "={{ $json.customer || 'عميلنا العزيز' }}"
                  },
                  {
                    "type": "text",
                    "text": "https://YOUR_REVIEW_LINK"
                  }
                ]
              }
            }
          ]
        }
      },
      "id": "47157a09-bfe3-4e1d-a09c-20a04769de30",
      "name": "Ask for a review",
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1,
      "position": [
        1500,
        0
      ]
    }
  ],
  "connections": {
    "Bosta update": {
      "main": [
        [
          {
            "node": "Read status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read status": {
      "main": [
        [
          {
            "node": "Delivered?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delivered?": {
      "main": [
        [
          {
            "node": "Wait 2 days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 2 days": {
      "main": [
        [
          {
            "node": "Find customer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find customer": {
      "main": [
        [
          {
            "node": "Ask for a review",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Point the review link at Google Maps or your store's review page — wherever reviews help you most.

Related flows