From 348403609b842699052559dc459f74153997d9a1 Mon Sep 17 00:00:00 2001 From: ankitottu Date: Wed, 24 Jun 2026 19:48:10 +0530 Subject: [PATCH 1/9] docs(mcp): expose /business/ routes in MCP server Removes /business/* from the docusaurus-plugin-mcp-server excludeRoutes so business pages are indexed and served by the MCP server. Fixes: docs_fetch returning "Page not found" for /business/ URLs Ref: #156237 --- docusaurus.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 47f44dd..fd127ff 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -252,7 +252,6 @@ const config: Config = { excludeRoutes: [ "/404*", "/search*", - "/business/*", "/developers/reference/*", "/overview/changelog*", ], From 9429c4130c01a1ab73e3de05ea0f05bea9bffcec Mon Sep 17 00:00:00 2001 From: Dacian Popute Date: Thu, 25 Jun 2026 11:28:52 +0300 Subject: [PATCH 2/9] docs(wallet): rename the Ottu Wallet feature to "M-Wallet" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename the Ottu merchant wallet (stored-balance feature) to "M-Wallet" (merchant wallet) so it can't be confused with digital wallets (Apple Pay, Google Pay, Samsung Wallet, STC Pay) or stacked loyalty wallets (e.g. Qitaf). Semantic rename, not a global find/replace: - Renamed every reference to *this* wallet → M-Wallet across the two main pages (developer + business), the four Checkout SDK platform sections, and the operations / payment-methods / payments-index / transaction-states pages. - Updated sidebar labels and the section-anchor hrefs whose headings changed; cross-page links and the regenerated API references follow the new anchors (e.g. operations#refund-to-m-wallet). - Renamed user-facing strings in the wallet demo + flow diagram (WalletDemo copy, scenario captions, SVG title/desc/labels). Deliberately left literal: - Product-UI-quoted strings (SDK "Wallet (X.XXX CCC)" chip, dashboard "Refund to Wallet" button, "Wallet → Accounts/Operations" menus, "Generated Reports → Wallet Exports") — the product UI is not renamed. - API contract values / code identifiers: payment_services ["wallet"], formsOfPayment ["wallet"], destination "wallet", provider_code "wallet_ottu", customer_wallet_transactions, component names, routes, image paths. - Generic / other-provider wallet language: "wallet provider", "one wallet per provider", multi-wallet stacking, loyalty wallets — M-Wallet is one wallet among these. - API reference titles (per request) — only fixed the operations anchor in the enrichment overlays for link integrity, then regenerated. Verified: typecheck passes, production build succeeds, no new broken links/anchors, no stale "Ottu Wallet" or old wallet anchors in shipped content. Co-Authored-By: Claude Opus 4.8 --- .../payment-management/transaction-states.md | 2 +- docs/business/wallet/index.md | 222 +++++++++--------- .../developers/apis/public-operations.api.mdx | 4 +- docs/developers/apis/wallet-accounts.api.mdx | 4 +- .../apis/wallet-operation-details.api.mdx | 4 +- docs/developers/operations.md | 20 +- .../payments/checkout-sdk/android.mdx | 18 +- .../payments/checkout-sdk/flutter.mdx | 18 +- docs/developers/payments/checkout-sdk/ios.mdx | 18 +- docs/developers/payments/checkout-sdk/web.mdx | 12 +- docs/developers/payments/index.md | 6 +- docs/developers/payments/payment-methods.md | 4 +- docs/developers/payments/wallet/index.mdx | 122 +++++----- sidebars.ts | 20 +- src/components/WalletDemo/WalletDemoInner.tsx | 12 +- src/components/WalletDemo/index.tsx | 2 +- src/data/wallet-scenarios.tsx | 20 +- src/diagrams/WalletFlowDiagram.tsx | 12 +- .../operations/payment-operations.yaml | 2 +- static/api-enrichments/operations/wallet.yaml | 4 +- 20 files changed, 263 insertions(+), 263 deletions(-) diff --git a/docs/business/payment-management/transaction-states.md b/docs/business/payment-management/transaction-states.md index dd4d239..90a9179 100644 --- a/docs/business/payment-management/transaction-states.md +++ b/docs/business/payment-management/transaction-states.md @@ -52,7 +52,7 @@ Child transactions are created when a merchant performs an operation (capture, r | Child State | Parent State | Description | | ------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Paid** | Authorized | A portion or all of the authorized amount has been captured. A child transaction record is created to track the capture. | -| **Refunded** | Authorized / Paid | A partial or full refund has been returned to the customer (to the original gateway or to the customer's [wallet](/business/wallet#refund-to-wallet)). | +| **Refunded** | Authorized / Paid | A partial or full refund has been returned to the customer (to the original gateway or to the customer's [M-Wallet](/business/wallet#refund-to-m-wallet)). | | **Refund-queued** | Authorized / Paid | The refund is awaiting bank approval. | | **Refund-rejected** | Authorized / Paid | The bank did not approve the refund. | | **Voided** | Authorized | The authorized amount has been reversed. The full amount (including any fee) is returned to the customer. | diff --git a/docs/business/wallet/index.md b/docs/business/wallet/index.md index e02cddf..2f7d04b 100644 --- a/docs/business/wallet/index.md +++ b/docs/business/wallet/index.md @@ -1,6 +1,6 @@ --- -title: Wallet -sidebar_label: Wallet +title: M-Wallet +sidebar_label: M-Wallet toc_min_heading_level: 2 toc_max_heading_level: 3 --- @@ -9,26 +9,26 @@ import StepGuide from "@site/src/components/StepGuide"; import { businessWalletScenariosSteps } from "@site/src/data/wallet-scenarios"; import FAQ, { FAQItem } from "@site/src/components/FAQ"; -# Wallet +# M-Wallet -Wallet is a stored balance you can grant to a customer in any currency you accept. Once a customer has wallet credit, they can spend it at checkout — fully or partially — on any future order with your business. +M-Wallet (merchant wallet) is a stored balance you can grant to a customer in any currency you accept. Once a customer has M-Wallet credit, they can spend it at checkout — fully or partially — on any future order with your business. -## Why use Wallet +## Why use M-Wallet - **Refund without returning funds to the original card.** Useful when cards expire, or when you want to issue store credit instead of cash back. - **Issue goodwill credit or promotional balances** without payment-gateway fees. -- **Reduce PG fees on future orders.** Customers spend wallet credit first; card only covers the remainder. +- **Reduce PG fees on future orders.** Customers spend M-Wallet credit first; card only covers the remainder. ## How it works 1. **Customer pays for an order** using any payment method. -2. **You refund to wallet** instead of refunding to their card — one action in the dashboard. +2. **You refund to M-Wallet** instead of refunding to their card — one action in the dashboard. 3. **Customer returns** for a future order with your business. -4. **They pay with wallet** — fully if the balance covers it, partially with another method otherwise. +4. **They pay with M-Wallet** — fully if the balance covers it, partially with another method otherwise. -## Refund to Wallet +## Refund to M-Wallet -Refunding to wallet credits the customer's wallet balance instead of returning funds through the payment gateway. The customer can spend the credit on their next order. +Refunding to M-Wallet credits the customer's M-Wallet balance instead of returning funds through the payment gateway. The customer can spend the credit on their next order. **When to use this:** @@ -57,83 +57,83 @@ Refunding to wallet credits the customer's wallet balance instead of returning f }, { title: "Confirm amount and submit", - description: <>Enter the full or partial refund amount, and click YES. The wallet balance is credited immediately., + description: <>Enter the full or partial refund amount, and click YES. The M-Wallet balance is credited immediately., image: "/img/business/wallet/refund-04-confirm.png", - imageAlt: "Confirming the wallet refund amount", + imageAlt: "Confirming the M-Wallet refund amount", }, { title: "See the confirmation", - description: <>A success popup shows the refunded wallet balance for the customer. The refund appears in both the transaction history and the wallet ledger., + description: <>A success popup shows the refunded M-Wallet balance for the customer. The refund appears in both the transaction history and the M-Wallet ledger., image: "/img/business/wallet/refund-05-success.png", - imageAlt: "Refund-to-wallet success popup showing new balance", + imageAlt: "Refund-to-M-Wallet success popup showing new balance", }, ]} /> -The next time the customer reaches checkout in your store (same currency), they'll see **Wallet (X.XXX USD)** as a payment method. See [Wallet at Checkout](#wallet-at-checkout) below for the customer-side flow. +The next time the customer reaches checkout in your store (same currency), they'll see **Wallet (X.XXX USD)** as a payment method. See [M-Wallet at Checkout](#m-wallet-at-checkout) below for the customer-side flow. -## Wallet at Checkout +## M-Wallet at Checkout -This section explains what your customer sees when they have a wallet balance and reach checkout — so you can answer support questions and design messaging on your own site. +This section explains what your customer sees when they have an M-Wallet balance and reach checkout — so you can answer support questions and design messaging on your own site. :::note Reservation auto-release -If a customer abandons, cancels, or fails a payment, the reserved wallet amount is restored to their balance about **four hours** later. The wait is intentional — it gives slow gateway confirmations time to land. There is no human in the loop. +If a customer abandons, cancels, or fails a payment, the reserved M-Wallet amount is restored to their balance about **four hours** later. The wait is intentional — it gives slow gateway confirmations time to land. There is no human in the loop. ::: **Rules customers cannot change:** -- They cannot choose how much wallet credit to apply — Ottu deducts the required amount automatically, no more. -- They cannot transfer credit between currencies — each currency has its own wallet. -- They cannot use wallet on authorize-only orders. Wallet supports immediate-capture flows only. +- They cannot choose how much M-Wallet credit to apply — Ottu deducts the required amount automatically, no more. +- They cannot transfer credit between currencies — each currency has its own M-Wallet. +- They cannot use M-Wallet on authorize-only orders. M-Wallet supports immediate-capture flows only. -:::warning Cross-currency wallet payments are not supported -The wallet only appears when its currency matches the order currency. +:::warning Cross-currency M-Wallet payments are not supported +The M-Wallet only appears when its currency matches the order currency. ::: :::note Offering multiple payment gateways on one checkout -If a checkout offers several payment gateways, make sure at most **one wallet per wallet provider** can be used for the order currency. If two gateways each carry a wallet from the same provider for that currency, the checkout cannot be created. See [Only one wallet per provider per checkout](/developers/payments/wallet/#2-create-a-checkout-session-with-the-wallet-capable-pgs) in the developer docs. +If a checkout offers several payment gateways, make sure at most **one wallet per wallet provider** can be used for the order currency. If two gateways each carry a wallet from the same provider for that currency, the checkout cannot be created. See [Only one wallet per provider per checkout](/developers/payments/wallet/#2-create-a-checkout-session-with-the-m-wallet-capable-pgs) in the developer docs. ::: **What you can do:** -- Display the customer's wallet balance on your own site or app — call the [Wallet Accounts API](/developers/payments/wallet/#api-reference). -- Refund any future order to the same wallet to top it up. -- View full credit and debit history per customer in [Wallet Reporting](#wallet-reporting) below. +- Display the customer's M-Wallet balance on your own site or app — call the [M-Wallet Accounts API](/developers/payments/wallet/#api-reference). +- Refund any future order to the same M-Wallet to top it up. +- View full credit and debit history per customer in [M-Wallet Reporting](#m-wallet-reporting) below. ## How fees are charged -When an order carries a processing fee, the wallet and the payment gateway (PG) do not share that fee. Ottu applies one simple rule: +When an order carries a processing fee, the M-Wallet and the payment gateway (PG) do not share that fee. Ottu applies one simple rule: -> **The wallet leg is fee-free. The processing fee always lands on the PG remainder — the part of the order paid through the gateway.** +> **The M-Wallet leg is fee-free. The processing fee always lands on the PG remainder — the part of the order paid through the gateway.** -The wallet only ever covers **principal** (the order amount itself). It never carries a fee. So whether a fee is charged at all depends on whether any part of the order still has to go through the PG. +The M-Wallet only ever covers **principal** (the order amount itself). It never carries a fee. So whether a fee is charged at all depends on whether any part of the order still has to go through the PG. This produces three cases at checkout. The examples below all use the same order: **amount 50.000, fee 10.000, total 60.000**. -| Case | Wallet balance | Wallet covers | PG covers | Fee charged | Customer pays | +| Case | M-Wallet balance | M-Wallet covers | PG covers | Fee charged | Customer pays | |---|---|---|---|---|---| -| **No wallet** | 0 (or no wallet) | nothing | 50.000 principal + 10.000 fee | **10.000** | 60.000 | -| **Partial wallet** | below the order amount — e.g. 30.000 | 30.000 principal | 20.000 principal + 10.000 fee | **10.000** | 30.000 | -| **Full wallet** | at or above the order amount — e.g. 50.000 or 100.000 | 50.000 principal (full) | nothing — no PG hop | **0.000** | 0.000 | +| **No M-Wallet** | 0 (or no M-Wallet) | nothing | 50.000 principal + 10.000 fee | **10.000** | 60.000 | +| **Partial M-Wallet** | below the order amount — e.g. 30.000 | 30.000 principal | 20.000 principal + 10.000 fee | **10.000** | 30.000 | +| **Full M-Wallet** | at or above the order amount — e.g. 50.000 or 100.000 | 50.000 principal (full) | nothing — no PG hop | **0.000** | 0.000 | -:::tip Full wallet coverage means no fee -When the customer's wallet balance is **equal to or greater than the order amount**, the wallet covers the entire principal and the payment never reaches a gateway. With no PG remainder, there is no fee to charge — the customer pays exactly the order amount, and the **Pay** button shows `0.000`. +:::tip Full M-Wallet coverage means no fee +When the customer's M-Wallet balance is **equal to or greater than the order amount**, the M-Wallet covers the entire principal and the payment never reaches a gateway. With no PG remainder, there is no fee to charge — the customer pays exactly the order amount, and the **Pay** button shows `0.000`. ::: -**Why the fee never moves to the wallet.** The processing fee exists to cover the cost of the gateway transaction. A fully wallet-covered payment is an internal balance transfer with no gateway transaction, so there is no cost to pass on. Partial-wallet payments still hit the gateway for the remainder, so the full fee rides along on that PG leg — it is not split in proportion to how much the wallet covered. +**Why the fee never moves to the M-Wallet.** The processing fee exists to cover the cost of the gateway transaction. A fully M-Wallet-covered payment is an internal balance transfer with no gateway transaction, so there is no cost to pass on. Partial-M-Wallet payments still hit the gateway for the remainder, so the full fee rides along on that PG leg — it is not split in proportion to how much the M-Wallet covered. -:::note Effect on a partial-wallet payment -In the partial-wallet case above, the customer pays 30.000 at checkout, but only 20.000 of that is principal — the other 10.000 is the fee. The wallet still contributed its full 30.000 toward principal. The fee did not reduce the wallet's contribution; it was added on top of the PG leg. +:::note Effect on a partial-M-Wallet payment +In the partial-M-Wallet case above, the customer pays 30.000 at checkout, but only 20.000 of that is principal — the other 10.000 is the fee. The M-Wallet still contributed its full 30.000 toward principal. The fee did not reduce the M-Wallet's contribution; it was added on top of the PG leg. ::: -## Wallet Reporting +## M-Wallet Reporting -The dashboard provides three screens for tracking wallet activity: **Accounts**, **Ledger**, and **Operations**. +The dashboard provides three screens for tracking M-Wallet activity: **Accounts**, **Ledger**, and **Operations**. ### Accounts screen -Lists every customer who has a wallet account with your business, with current balance per currency. +Lists every customer who has an M-Wallet account with your business, with current balance per currency. Click any row to open the account's full ledger history for that customer and currency., image: "/img/business/wallet/reporting-03-detail.png", - imageAlt: "Individual wallet account ledger view", + imageAlt: "Individual M-Wallet account ledger view", }, ]} /> @@ -180,7 +180,7 @@ Every credit, debit, and reservation for an account lives in the ledger. Entries - **Operation ID** — unique identifier for the ledger row. - **Entry Type** — `credit_refund`, `debit_payment`, `debit_adjustment`, `credit_adjustment`, `reserve`, `release`, `expire`, or `reversal`. -- **Amount** — signed amount in the wallet currency. +- **Amount** — signed amount in the M-Wallet currency. - **Direction** — high-level accounting direction: `credit` (balance increases) or `debit` (balance decreases). Use it for quick filtering; see Entry Type for the exact operation. - **Status** — current state of the entry (`pending`, `completed`, `failed`, etc.). - **Linked session** — the original payment session this entry references, if any. @@ -190,32 +190,32 @@ Every credit, debit, and reservation for an account lives in the ledger. Entries ### Operations screen -Lists individual wallet operations (a single credit, debit, or reservation cycle) across all accounts. Useful for audit and reconciliation. +Lists individual M-Wallet operations (a single credit, debit, or reservation cycle) across all accounts. Useful for audit and reconciliation. ![Operations screen with filters and operation rows](/img/business/wallet/reporting-05-operations.png) ## Reconciliation -Wallet-enabled payments settle across two separate rails — the **wallet rail** (funds moved internally between Ottu wallet balances, no card scheme involved) and the **PG rail** (funds charged through a payment gateway and settled by the acquirer). A single customer order may use one rail or both, so your month-end reconciliation needs to account for both sources of funds. +M-Wallet-enabled payments settle across two separate rails — the **M-Wallet rail** (funds moved internally between M-Wallet balances, no card scheme involved) and the **PG rail** (funds charged through a payment gateway and settled by the acquirer). A single customer order may use one rail or both, so your month-end reconciliation needs to account for both sources of funds. -This section explains how Ottu represents a wallet-touched payment in your transaction records, and gives a step-by-step procedure for matching it against your wallet ledger and PG settlement files. +This section explains how Ottu represents an M-Wallet-touched payment in your transaction records, and gives a step-by-step procedure for matching it against your M-Wallet ledger and PG settlement files. -### How a wallet payment appears in your records +### How an M-Wallet payment appears in your records -Ottu records every order as a **parent transaction** at the full order amount. When part (or all) of the order is paid from the customer's wallet, Ottu also creates a **child transaction** linked to the parent, carrying just the wallet portion. The child shares the same `session_id` as the parent but has its own `order_no`. +Ottu records every order as a **parent transaction** at the full order amount. When part (or all) of the order is paid from the customer's M-Wallet, Ottu also creates a **child transaction** linked to the parent, carrying just the M-Wallet portion. The child shares the same `session_id` as the parent but has its own `order_no`. There are two flows you will see: -| Flow | Wallet covers | What you see in records | +| Flow | M-Wallet covers | What you see in records | |---|---|---| -| **A — Full wallet (checkout)** | 100% of the order | Parent at the full amount + **one child** at the same amount. No PG attempt. | -| **B — Partial wallet + PG (checkout)** | Less than 100% | Parent at the full amount, with **one PG attempt** for the remainder + **one child** for the wallet portion. | +| **A — Full M-Wallet (checkout)** | 100% of the order | Parent at the full amount + **one child** at the same amount. No PG attempt. | +| **B — Partial M-Wallet + PG (checkout)** | Less than 100% | Parent at the full amount, with **one PG attempt** for the remainder + **one child** for the M-Wallet portion. | -:::note Why the parent shows a "blank" wallet attempt -After the wallet leg settles, the parent transaction records a zero-amount attempt with the form of payment set to `wallet`. This is bookkeeping — it tells you the parent was finalized through the wallet rail. In partial-wallet flows (B), this blank attempt sits alongside the PG attempt; in full-wallet flows (A), it is the only parent attempt. You should treat it as a finalization marker, not as a separate charge. +:::note Why the parent shows a "blank" M-Wallet attempt +After the M-Wallet leg settles, the parent transaction records a zero-amount attempt with the form of payment set to `wallet`. This is bookkeeping — it tells you the parent was finalized through the M-Wallet rail. In partial-M-Wallet flows (B), this blank attempt sits alongside the PG attempt; in full-M-Wallet flows (A), it is the only parent attempt. You should treat it as a finalization marker, not as a separate charge. ::: -#### Amount fields on a wallet-touched payment +#### Amount fields on an M-Wallet-touched payment On the parent transaction page, three amount fields together tell you how the order was paid: @@ -223,18 +223,18 @@ On the parent transaction page, three amount fields together tell you how the or - **`settled_amount`** — the paid or authorized amount in the original currency, excluding fees. When the order is fully settled across both rails, this equals `amount`. - **`paid_amount`** — the total paid amount in the original currency, including fees, possibly after currency exchange. **This is the PG-rail total** — the portion the customer was actually charged through the gateway. Use it to check the PG-side number. -On the child transaction page, you'll see just `amount` — the wallet portion. +On the child transaction page, you'll see just `amount` — the M-Wallet portion. -#### Example — partial wallet payment of 20.00 USD +#### Example — partial M-Wallet payment of 20.00 USD -A customer pays a 20.00 USD order with 10.00 USD from their wallet and 10.00 USD on a card: +A customer pays a 20.00 USD order with 10.00 USD from their M-Wallet and 10.00 USD on a card: **Parent transaction** | Field | Value | Notes | |---|---|---| | `amount` | 20.00 USD | Total order value. | -| `settled_amount` | 20.00 USD | Total settled across both rails (PG + wallet). | +| `settled_amount` | 20.00 USD | Total settled across both rails (PG + M-Wallet). | | `paid_amount` | 10.00 USD | PG-rail charge actually paid by the customer. | | `state` | `PAID` | The order is fully paid. | @@ -242,16 +242,16 @@ A customer pays a 20.00 USD order with 10.00 USD from their wallet and 10.00 USD | Field | Value | Notes | |---|---|---| -| `amount` | 10.00 USD | The wallet leg. | -| `state` | `PAID` | Wallet leg committed. | +| `amount` | 10.00 USD | The M-Wallet leg. | +| `state` | `PAID` | M-Wallet leg committed. | -**Reconciliation identity** — every wallet-touched parent satisfies this: +**Reconciliation identity** — every M-Wallet-touched parent satisfies this: ``` parent.amount == parent.paid_amount + sum(child.amount for each wallet child) ``` -In plain English: **order total = PG-rail total + wallet-rail total.** +In plain English: **order total = PG-rail total + M-Wallet-rail total.** #### Where to find these fields in the dashboard @@ -264,36 +264,36 @@ In plain English: **order total = PG-rail total + wallet-rail total.** }, { title: "Linked child transaction", - description: <>From the parent, open the linked child transaction. The child's Amount is the wallet portion, and its Session ID matches the parent's., + description: <>From the parent, open the linked child transaction. The child's Amount is the M-Wallet portion, and its Session ID matches the parent's., image: "/img/business/wallet/reconciliation-02-child-transaction.png", - imageAlt: "Child transaction detail page showing the wallet-portion amount and shared session ID", + imageAlt: "Child transaction detail page showing the M-Wallet-portion amount and shared session ID", }, { - title: "Operations screen — wallet leg", - description: <>On the Wallet → Operations screen, search by operation_id (from customer_wallet_transactions) to see the canonical wallet-side row for that leg., + title: "Operations screen — M-Wallet leg", + description: <>On the Wallet → Operations screen, search by operation_id (from customer_wallet_transactions) to see the canonical M-Wallet-side row for that leg., image: "/img/business/wallet/reporting-05-operations1.png", - imageAlt: "Operations screen with a wallet operation row highlighted", + imageAlt: "Operations screen with an M-Wallet operation row highlighted", }, ]} /> -### Where to find the wallet portion of a payment +### Where to find the M-Wallet portion of a payment Each parent transaction's webhook payload (and dashboard detail page) carries two arrays you will use during reconciliation: -- **`transactions`** — the parent's child transactions. Contains one entry for the wallet leg of a wallet-touched payment. +- **`transactions`** — the parent's child transactions. Contains one entry for the M-Wallet leg of an M-Wallet-touched payment. - **`customer_wallet_transactions`** — one entry per wallet provider that touched this payment. Each entry includes `provider_code`, `amount` (in the order currency), `currency`, `operation_id`, and the verbatim `wallet_response` from the wallet service. :::warning `customer_wallet_transactions` is omitted when no wallet was used The key is **not present at all** on payments that never touched a wallet. Your reconciliation script should treat a missing key the same as an empty list. ::: -**Multi-wallet stacking.** If your setup supports more than one wallet provider (for example, Ottu Wallet + Qitaf), `customer_wallet_transactions` will contain one entry per provider that contributed funds. Sum the `amount` fields to get the total wallet portion of the payment. Ordering is not guaranteed — treat the array as a set. +**Multi-wallet stacking.** If your setup supports more than one wallet provider (for example, M-Wallet + Qitaf), `customer_wallet_transactions` will contain one entry per provider that contributed funds. Sum the `amount` fields to get the total wallet portion of the payment. Ordering is not guaranteed — treat the array as a set. **Cross-currency reservations.** When the wallet's native ledger currency differs from the order currency (rare, but possible), the entry includes `wallet_amount_native` and `wallet_currency` fields alongside `amount` and `currency`. Reconcile against the wallet ledger using the native values; use `amount`/`currency` for the order-side math. ### Month-end reconciliation procedure -Run this once per settlement period (typically monthly). The goal is to prove that every unit of order revenue lands in exactly one of two places: your PG settlement file or your wallet ledger. +Run this once per settlement period (typically monthly). The goal is to prove that every unit of order revenue lands in exactly one of two places: your PG settlement file or your M-Wallet ledger. For each parent, check whether it has child transactions and wallet entries: no wallet entries → pure PG payment (no wallet to reconcile); wallet entries + child transactions → full or partial wallet payment., + description: <>For each parent, check whether it has child transactions and M-Wallet entries: no M-Wallet entries → pure PG payment (no M-Wallet to reconcile); M-Wallet entries + child transactions → full or partial M-Wallet payment., image: "/img/business/wallet/recon-procedure-02-classify.png", - imageAlt: "Parent transaction's CHILD TRANSACTIONS tab showing a linked wallet-leg row — the marker that classifies the parent as wallet-touched", + imageAlt: "Parent transaction's CHILD TRANSACTIONS tab showing a linked M-Wallet-leg row — the marker that classifies the parent as M-Wallet-touched", }, { - title: "Split each payment into wallet and PG portions", - description: <>For each wallet-touched parent: pg_total = parent.paid_amount and wallet_total = sum of child transaction amounts. The two should add up to parent.amount exactly. If they don't, flag the transaction for investigation., + title: "Split each payment into M-Wallet and PG portions", + description: <>For each M-Wallet-touched parent: pg_total = parent.paid_amount and wallet_total = sum of child transaction amounts. The two should add up to parent.amount exactly. If they don't, flag the transaction for investigation., image: "/img/business/wallet/recon-procedure-03-amount-split.png", - imageAlt: "Parent transaction's AMOUNT tab with Amount, Settled amount, and Paid amount fields — the values used to compute the wallet vs PG split", + imageAlt: "Parent transaction's AMOUNT tab with Amount, Settled amount, and Paid amount fields — the values used to compute the M-Wallet vs PG split", }, { title: "Match the PG portion against your gateway settlement", description: <>For each parent with parent.paid_amount > 0, find the matching line in your payment gateway's settlement file using the parent's order_no or the PG reference number. The gateway-side amount should equal parent.paid_amount., }, { - title: "Match the wallet portion against your wallet ledger", - description: <>For each entry in customer_wallet_transactions, open the Operations screen (or call the wallet operations API) using the entry's operation_id. The wallet ledger should show a debit of the same amount. Sum all wallet debits across the period — they should equal your wallet-rail settlement total., + title: "Match the M-Wallet portion against your M-Wallet ledger", + description: <>For each entry in customer_wallet_transactions, open the Operations screen (or call the M-Wallet operations API) using the entry's operation_id. The M-Wallet ledger should show a debit of the same amount. Sum all M-Wallet debits across the period — they should equal your M-Wallet-rail settlement total., image: "/img/business/wallet/reporting-05-operations1.png", - imageAlt: "Operations screen used to look up a wallet operation by ID", + imageAlt: "Operations screen used to look up an M-Wallet operation by ID", }, { - title: "Reconcile refunds-to-wallet separately", - description: <>For any parent with a refund child transaction whose attempt carries a wallet operation, the wallet ledger should show a matching credit. Match these by the parent's session_id or order_nonot by operation_id, because the original payment debit and the refund credit have different operation IDs., + title: "Reconcile refunds-to-M-Wallet separately", + description: <>For any parent with a refund child transaction whose attempt carries an M-Wallet operation, the M-Wallet ledger should show a matching credit. Match these by the parent's session_id or order_nonot by operation_id, because the original payment debit and the refund credit have different operation IDs., image: "/img/business/wallet/recon-procedure-04-refund-credit.png", - imageAlt: "Wallet account detail showing credit_refund rows on the ledger — the wallet-side mirror of a refund-to-wallet operation", + imageAlt: "M-Wallet account detail showing credit_refund rows on the ledger — the M-Wallet-side mirror of a refund-to-M-Wallet operation", }, ]} /> -:::tip Use the Operations screen as your wallet-side source of truth -Every wallet leg — debit, credit, reserve, release — has a single canonical row on the Operations screen, keyed by operation_id. When a number disagrees between the PG file and the parent transaction, the Operations row tells you what actually moved on the wallet rail. +:::tip Use the Operations screen as your M-Wallet-side source of truth +Every M-Wallet leg — debit, credit, reserve, release — has a single canonical row on the Operations screen, keyed by operation_id. When a number disagrees between the PG file and the parent transaction, the Operations row tells you what actually moved on the M-Wallet rail. ::: ### Edge cases to watch for -- **Abandoned or cancelled wallet payments.** If a customer reserves wallet funds but never completes the payment, the reservation is released automatically about four hours later. The released leg may still appear in `customer_wallet_transactions` so you can audit attempted-but-released holds — check the state of the parent transaction (`FAILED`, `CANCELLED`) before counting wallet amounts. -- **Refund operation IDs differ from payment operation IDs.** A refund to wallet creates a fresh `operation_id` for the credit; it does not reuse the original payment's debit ID. Always match refunds to original payments through `session_id` or `order_no`, not through `operation_id`. +- **Abandoned or cancelled M-Wallet payments.** If a customer reserves M-Wallet funds but never completes the payment, the reservation is released automatically about four hours later. The released leg may still appear in `customer_wallet_transactions` so you can audit attempted-but-released holds — check the state of the parent transaction (`FAILED`, `CANCELLED`) before counting M-Wallet amounts. +- **Refund operation IDs differ from payment operation IDs.** A refund to M-Wallet creates a fresh `operation_id` for the credit; it does not reuse the original payment's debit ID. Always match refunds to original payments through `session_id` or `order_no`, not through `operation_id`. - **Wallet response format is provider-specific.** The `wallet_response` field in `customer_wallet_transactions` is the verbatim body returned by the wallet service. Treat it as audit-only — do not parse it for reconciliation logic. - **Only the parent fires webhooks.** Child transactions do not emit their own webhooks. The child's state is always visible inside the parent's webhook payload under `transactions`. @@ -371,53 +371,53 @@ Export Accounts or Ledger data as **CSV** or **XLSX** for offline analysis and a ## Things to know -- **One wallet per currency.** A customer who buys in both EUR and USD has two separate wallet balances. -- **No PII.** The wallet service stores only the customer ID and balance — no card details, no personal information. -- **Automatic release.** If a customer abandons checkout, their reserved wallet funds are released automatically after about four hours. No action required from you. +- **One M-Wallet per currency.** A customer who buys in both EUR and USD has two separate M-Wallet balances. +- **No PII.** The M-Wallet service stores only the customer ID and balance — no card details, no personal information. +- **Automatic release.** If a customer abandons checkout, their reserved M-Wallet funds are released automatically after about four hours. No action required from you. - **Immutable history.** Every credit, debit, and reservation is recorded permanently. Corrections are made by adding an opposing entry — never by editing the original. -- **No expiry.** Wallet credit does not expire. -- **Wallet appears at checkout when:** the customer has positive balance in the order currency **and** the order is set to capture immediately. Authorize-only orders do not show wallet. +- **No expiry.** M-Wallet credit does not expire. +- **M-Wallet appears at checkout when:** the customer has positive balance in the order currency **and** the order is set to capture immediately. Authorize-only orders do not show M-Wallet. ## FAQ - + Yes. Enter any amount up to the original payment amount. - - Yes. If the customer has no wallet account for that currency, one is created automatically on the first refund. + + Yes. If the customer has no M-Wallet account for that currency, one is created automatically on the first refund. - - You cannot edit or delete the original credit — wallet history is immutable. You can issue an opposing debit entry (a reversal) to offset it. Contact [csd@ottu.com](mailto:csd@ottu.com) if you need help raising a reversal. + + You cannot edit or delete the original credit — M-Wallet history is immutable. You can issue an opposing debit entry (a reversal) to offset it. Contact [csd@ottu.com](mailto:csd@ottu.com) if you need help raising a reversal. - No, customers are not notified automatically when a wallet credit is issued. If you want to notify them, message them through your own channels. + No, customers are not notified automatically when an M-Wallet credit is issued. If you want to notify them, message them through your own channels. - - The order may be authorize-only, the customer may have zero balance in that currency, or the `customer_id` may differ between sessions. Check the order's `customer_id` matches the wallet's. + + The order may be authorize-only, the customer may have zero balance in that currency, or the `customer_id` may differ between sessions. Check the order's `customer_id` matches the M-Wallet's. - + Disputes can be resolved manually. Contact [csd@ottu.com](mailto:csd@ottu.com) to raise a reversal. - - No, wallet credit does not expire. + + No, M-Wallet credit does not expire. - - Reserved wallet funds are automatically restored about four hours after an abandoned, cancelled, or failed payment. No action is needed. + + Reserved M-Wallet funds are automatically restored about four hours after an abandoned, cancelled, or failed payment. No action is needed. - + No. Entries are immutable. To correct an error, issue a reversal — an opposing debit or credit. Contact [csd@ottu.com](mailto:csd@ottu.com) for help. - - No. A wallet account opens automatically on the first refund-to-wallet and behaves as non-existent when the balance is zero — no maintenance needed. + + No. An M-Wallet account opens automatically on the first refund-to-M-Wallet and behaves as non-existent when the balance is zero — no maintenance needed. - + Open the ledger entry — the **Linked session** field gives you the original payment's `session_id`. Click it to jump to the payment in Payment Management. ## What's Next? -- [Wallet for developers](/developers/payments/wallet/) — API and SDK integration. +- [M-Wallet for developers](/developers/payments/wallet/) — API and SDK integration. - [Payment Management](/business/payment-management/) — viewing and managing all transactions. -- [Refund to Wallet (developer reference)](/developers/operations#refund-to-wallet) — the API behind the dashboard refund flow. +- [Refund to M-Wallet (developer reference)](/developers/operations#refund-to-m-wallet) — the API behind the dashboard refund flow. diff --git a/docs/developers/apis/public-operations.api.mdx b/docs/developers/apis/public-operations.api.mdx index 8cf2b39..286a890 100644 --- a/docs/developers/apis/public-operations.api.mdx +++ b/docs/developers/apis/public-operations.api.mdx @@ -5,7 +5,7 @@ description: "Perform operations on existing payment transactions. Supports `ref sidebar_label: "Operations" hide_title: true hide_table_of_contents: true -api: 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 +api: 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 sidebar_class_name: "post api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -41,7 +41,7 @@ Perform operations on existing payment transactions. Supports `refund`, `capture Use `session_id` or `order_no` to identify the target transaction. For `refund` and `capture`, specify `amount` (defaults to full/remaining amount). For `void`, always applies to the full amount. -Refunds can target the **original payment gateway** (default) or the **customer's wallet** by setting `destination: "wallet"`. See [Refund to Wallet](/developers/operations#refund-to-wallet) and the [Wallet integration page](/developers/payments/wallet/) for full behavior. +Refunds can target the **original payment gateway** (default) or the **customer's wallet** by setting `destination: "wallet"`. See [Refund to Wallet](/developers/operations#refund-to-m-wallet) and the [Wallet integration page](/developers/payments/wallet/) for full behavior. Include `Tracking-Key` header on external operations to prevent duplicates and retrieve status. diff --git a/docs/developers/apis/wallet-accounts.api.mdx b/docs/developers/apis/wallet-accounts.api.mdx index e77eff5..6f896c0 100644 --- a/docs/developers/apis/wallet-accounts.api.mdx +++ b/docs/developers/apis/wallet-accounts.api.mdx @@ -5,7 +5,7 @@ description: "Returns the customer's wallet accounts — one per currency — wi sidebar_label: "List wallet accounts for a customer" hide_title: true hide_table_of_contents: true -api: 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 +api: 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 sidebar_class_name: "post api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -39,7 +39,7 @@ import Translate from "@docusaurus/Translate"; Returns the customer's wallet accounts — one per currency — with confirmed and available balances. -Accounts are created lazily: one exists only after the first credit lands in that currency (a [refund to wallet](/developers/operations/#refund-to-wallet), a manual adjustment, a promo, or a goodwill credit). A customer who has never received a wallet credit in a given currency has no account in that currency, and none is returned — `count: 0` with an empty `results` array is a valid response. +Accounts are created lazily: one exists only after the first credit lands in that currency (a [refund to wallet](/developers/operations/#refund-to-m-wallet), a manual adjustment, a promo, or a goodwill credit). A customer who has never received a wallet credit in a given currency has no account in that currency, and none is returned — `count: 0` with an empty `results` array is a valid response. `balance` reflects confirmed funds only; `available_balance` is `balance` minus the amounts held by in-flight checkout reservations, and is what the customer can actually spend right now. Results are cursor-paginated — pass the `pagination.cursor` value from the `next` object to fetch the following page. diff --git a/docs/developers/apis/wallet-operation-details.api.mdx b/docs/developers/apis/wallet-operation-details.api.mdx index 9020af4..2a8912c 100644 --- a/docs/developers/apis/wallet-operation-details.api.mdx +++ b/docs/developers/apis/wallet-operation-details.api.mdx @@ -5,7 +5,7 @@ description: "Returns a single wallet operation by its `operation_id`, together sidebar_label: "Get a single wallet operation by id" hide_title: true hide_table_of_contents: true -api: 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 +api: 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 sidebar_class_name: "post api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -39,7 +39,7 @@ import Translate from "@docusaurus/Translate"; Returns a single wallet operation by its `operation_id`, together with every ledger entry it produced. An operation is the atomic unit of work the wallet performs — a reservation, a refund, a deduction, an adjustment, or a reversal — and rolls up one or more ledger entries under one identifier. -Use this when you have an operation ID from an earlier response — for example the operation returned by a [refund to wallet](/developers/operations/#refund-to-wallet) — and you want the canonical record for audit or reconciliation. A reservation operation, for instance, produces a `reserve` entry that is later closed by a `debit_payment` entry from the deduction operation; both are returned here. +Use this when you have an operation ID from an earlier response — for example the operation returned by a [refund to wallet](/developers/operations/#refund-to-m-wallet) — and you want the canonical record for audit or reconciliation. A reservation operation, for instance, produces a `reserve` entry that is later closed by a `debit_payment` entry from the deduction operation; both are returned here.
{"curl --location 'https://sandbox.ottu.net/b/wallet/ottu/v1/operations/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"operation_id\": 0\n}'"}
diff --git a/docs/developers/operations.md b/docs/developers/operations.md index c86712e..e33fb76 100644 --- a/docs/developers/operations.md +++ b/docs/developers/operations.md @@ -119,9 +119,9 @@ Settles authorized funds. Only applicable to `authorized` transactions. Supports Returns funds to the customer. Applicable to `paid` or captured transactions. For authorized transactions, a capture must be completed first. Supports full or partial refund. Ottu offers an [approval feature](/business/operations/refund-void-access-control) for refunds, enabling a checker role to approve or reject requests. -##### Refund to Wallet {#refund-to-wallet} +##### Refund to M-Wallet {#refund-to-m-wallet} -Instead of returning funds through the original payment gateway, you can refund a payment directly to the customer's **wallet** balance. The customer can then spend that credit at any future Ottu checkout in the same currency. See [Wallet](/developers/payments/wallet/) for the full feature overview. +Instead of returning funds through the original payment gateway, you can refund a payment directly to the customer's **M-Wallet** balance. The customer can then spend that credit at any future Ottu checkout in the same currency. See [M-Wallet](/developers/payments/wallet/) for the full feature overview. **When to use:** @@ -132,27 +132,27 @@ Instead of returning funds through the original payment gateway, you can refund Set `destination: "wallet"` on the refund operation request. The `destination` field defaults to `"pg"` when omitted, preserving the original refund behavior. See the [API Reference](#api-reference) below for the full request schema and interactive try-it-out. :::tip Use `Tracking-Key` for idempotency -Wallet credits are immutable — a duplicate refund-to-wallet call creates a second uneditable credit entry (the gateway path fails on duplicates; the wallet path does not). Always include the `Tracking-Key` header so retries deduplicate. See [the Guide above](#guide) for the full idempotency contract. +M-Wallet credits are immutable — a duplicate refund-to-M-Wallet call creates a second uneditable credit entry (the gateway path fails on duplicates; the M-Wallet path does not). Always include the `Tracking-Key` header so retries deduplicate. See [the Guide above](#guide) for the full idempotency contract. ::: **Behavior:** -- A wallet account is created automatically if one doesn't exist for the (merchant, customer, currency) combination. +- An M-Wallet account is created automatically if one doesn't exist for the (merchant, customer, currency) combination. - The credit is recorded as an immutable ledger entry — corrections require an opposing reversal entry. - The original payment session is linked to the credit entry for audit. -- No PII is stored on the wallet service. -- Disputes against the original payment after a refund-to-wallet can be resolved manually — contact [csd@ottu.com](mailto:csd@ottu.com) to raise a reversal. +- No PII is stored on the M-Wallet service. +- Disputes against the original payment after a refund-to-M-Wallet can be resolved manually — contact [csd@ottu.com](mailto:csd@ottu.com) to raise a reversal. **Errors:** | HTTP | Code | When | |------|------|------| -| 400 | `account_inactive` | Wallet account is suspended | -| 400 | `policy_violation` | Refund amount violates a wallet policy rule | +| 400 | `account_inactive` | M-Wallet account is suspended | +| 400 | `policy_violation` | Refund amount violates an M-Wallet policy rule | | 409 | `idempotency_conflict` | Same Idempotency-Key reused with different payload | | 422 | `validation_error` | Schema validation failed on the refund payload | -For the full wallet integration, including the read APIs and SDK behavior, see [Wallet](/developers/payments/wallet/). For the merchant dashboard workflow, see [Refund to Wallet (business docs)](/business/wallet#refund-to-wallet). +For the full M-Wallet integration, including the read APIs and SDK behavior, see [M-Wallet](/developers/payments/wallet/). For the merchant dashboard workflow, see [Refund to M-Wallet (business docs)](/business/wallet#refund-to-m-wallet). ##### Void {#void} @@ -180,7 +180,7 @@ Select the operation to see its example payload and the full interactive API sch - + ```json title="Example Request" { diff --git a/docs/developers/payments/checkout-sdk/android.mdx b/docs/developers/payments/checkout-sdk/android.mdx index e96368d..1190032 100644 --- a/docs/developers/payments/checkout-sdk/android.mdx +++ b/docs/developers/payments/checkout-sdk/android.mdx @@ -706,14 +706,14 @@ The SDK supports multiple instances of onsite checkout payments. Therefore, for Fees are not displayed for onsite checkout instances due to the support of multiple card types through omni PG (multi-card) configurations. The presence of multiple payment icons also indicates this multi-card functionality. ::: -## Ottu Wallet +## M-Wallet -When a customer has wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. Wallet is hidden for authorize-only sessions. +When a customer has M-Wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. M-Wallet is hidden for authorize-only sessions. -For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [Wallet section](/developers/payments/wallet/). +For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [M-Wallet section](/developers/payments/wallet/). -:::warning Cross-currency wallet payments are not supported -The wallet only appears when its currency matches the order currency. +:::warning Cross-currency M-Wallet payments are not supported +The M-Wallet only appears when its currency matches the order currency. ::: Customer selects Wallet → SDK shows "10.000 KWD will be applied" → submits → only the session amount is deducted. Surplus stays in the wallet., + description: <>Customer selects Wallet → SDK shows "10.000 KWD will be applied" → submits → only the session amount is deducted. Surplus stays in the M-Wallet., image: "/img/developers/wallet/sdk-02-full-coverage-android.png", imageAlt: "Android wallet selected with full coverage", }, @@ -736,14 +736,14 @@ The wallet only appears when its currency matches the order currency. imageAlt: "Android wallet plus card combined for partial coverage", }, { - title: "Authorize-only: wallet hidden", - description: <>When the session is configured for authorization-only, wallet is not offered. Wallet supports immediate-capture flows only., + title: "Authorize-only: M-Wallet hidden", + description: <>When the session is configured for authorization-only, M-Wallet is not offered. M-Wallet supports immediate-capture flows only., image: "/img/developers/wallet/sdk-04-authorize-hidden-android.png", imageAlt: "Android authorize-only checkout without wallet method", }, { title: "Try it", - description: <>The live demo seeds a fresh wallet for a generated customer_id and launches the SDK with wallet enabled. Use the demo on the Wallet overview page., + description: <>The live demo seeds a fresh M-Wallet for a generated customer_id and launches the SDK with M-Wallet enabled. Use the demo on the M-Wallet overview page., image: "/img/developers/wallet/sdk-05-live-demo.png", imageAlt: "Wallet live demo entry point", }, diff --git a/docs/developers/payments/checkout-sdk/flutter.mdx b/docs/developers/payments/checkout-sdk/flutter.mdx index 44ad3e1..1e60510 100644 --- a/docs/developers/payments/checkout-sdk/flutter.mdx +++ b/docs/developers/payments/checkout-sdk/flutter.mdx @@ -791,14 +791,14 @@ The SDK supports multiple instances of onsite checkout payments. Therefore, for No fees are displayed for onsite checkout instances. This is due to the support for multiple multi-card (omni PG) configurations. The presence of multiple payment icons is used to indicate this multi-card feature. ::: -## Ottu Wallet +## M-Wallet -When a customer has wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. Wallet is hidden for authorize-only sessions. +When a customer has M-Wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. M-Wallet is hidden for authorize-only sessions. -For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [Wallet section](/developers/payments/wallet/). +For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [M-Wallet section](/developers/payments/wallet/). -:::warning Cross-currency wallet payments are not supported -The wallet only appears when its currency matches the order currency. +:::warning Cross-currency M-Wallet payments are not supported +The M-Wallet only appears when its currency matches the order currency. ::: Customer selects Wallet → SDK shows "10.000 KWD will be applied" → submits → only the session amount is deducted. Surplus stays in the wallet., + description: <>Customer selects Wallet → SDK shows "10.000 KWD will be applied" → submits → only the session amount is deducted. Surplus stays in the M-Wallet., image: "/img/developers/wallet/sdk-02-full-coverage-flutter.png", imageAlt: "Flutter wallet selected with full coverage", }, @@ -821,14 +821,14 @@ The wallet only appears when its currency matches the order currency. imageAlt: "Flutter wallet plus card combined for partial coverage", }, { - title: "Authorize-only: wallet hidden", - description: <>When the session is configured for authorization-only, wallet is not offered. Wallet supports immediate-capture flows only., + title: "Authorize-only: M-Wallet hidden", + description: <>When the session is configured for authorization-only, M-Wallet is not offered. M-Wallet supports immediate-capture flows only., image: "/img/developers/wallet/sdk-04-authorize-hidden-flutter.png", imageAlt: "Flutter authorize-only checkout without wallet method", }, { title: "Try it", - description: <>The live demo seeds a fresh wallet for a generated customer_id and launches the SDK with wallet enabled. Use the demo on the Wallet overview page., + description: <>The live demo seeds a fresh M-Wallet for a generated customer_id and launches the SDK with M-Wallet enabled. Use the demo on the M-Wallet overview page., image: "/img/developers/wallet/sdk-05-live-demo.png", imageAlt: "Wallet live demo entry point", }, diff --git a/docs/developers/payments/checkout-sdk/ios.mdx b/docs/developers/payments/checkout-sdk/ios.mdx index e394614..276537f 100644 --- a/docs/developers/payments/checkout-sdk/ios.mdx +++ b/docs/developers/payments/checkout-sdk/ios.mdx @@ -679,14 +679,14 @@ The SDK supports multiple instances of onsite checkout payments. Therefore, for Fees are not shown for onsite checkout instances because the system supports payments through multiple cards (omni PG). The multiple payment icons indicate the availability of different card options. ::: -## Ottu Wallet +## M-Wallet -When a customer has wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. Wallet is hidden for authorize-only sessions. +When a customer has M-Wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. M-Wallet is hidden for authorize-only sessions. -For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [Wallet section](/developers/payments/wallet/). +For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [M-Wallet section](/developers/payments/wallet/). -:::warning Cross-currency wallet payments are not supported -The wallet only appears when its currency matches the order currency. +:::warning Cross-currency M-Wallet payments are not supported +The M-Wallet only appears when its currency matches the order currency. ::: Customer selects Wallet → SDK shows "10.000 KWD will be applied" → submits → only the session amount is deducted. Surplus stays in the wallet., + description: <>Customer selects Wallet → SDK shows "10.000 KWD will be applied" → submits → only the session amount is deducted. Surplus stays in the M-Wallet., image: "/img/developers/wallet/sdk-02-full-coverage-ios.png", imageAlt: "iOS wallet selected with full coverage", }, @@ -709,14 +709,14 @@ The wallet only appears when its currency matches the order currency. imageAlt: "iOS wallet plus card combined for partial coverage", }, { - title: "Authorize-only: wallet hidden", - description: <>When the session is configured for authorization-only, wallet is not offered. Wallet supports immediate-capture flows only., + title: "Authorize-only: M-Wallet hidden", + description: <>When the session is configured for authorization-only, M-Wallet is not offered. M-Wallet supports immediate-capture flows only., image: "/img/developers/wallet/sdk-04-authorize-hidden-ios.png", imageAlt: "iOS authorize-only checkout without wallet method", }, { title: "Try it", - description: <>The live demo seeds a fresh wallet for a generated customer_id and launches the SDK with wallet enabled. Use the demo on the Wallet overview page., + description: <>The live demo seeds a fresh M-Wallet for a generated customer_id and launches the SDK with M-Wallet enabled. Use the demo on the M-Wallet overview page., image: "/img/developers/wallet/sdk-05-live-demo.png", imageAlt: "Wallet live demo entry point", }, diff --git a/docs/developers/payments/checkout-sdk/web.mdx b/docs/developers/payments/checkout-sdk/web.mdx index 2052925..cc0980a 100644 --- a/docs/developers/payments/checkout-sdk/web.mdx +++ b/docs/developers/payments/checkout-sdk/web.mdx @@ -141,7 +141,7 @@ The available options for `formsOfPayment` are: - `stcPay`: A method where customers enter their mobile number and provide an OTP send to their mobile number to complete their payment. - `urPay`: A method where customers enter their mobile number and provide an OTP send to their mobile number to complete their payment. - `jazz`: Renders Ottu's onsite card form inline using the Jazz SDK, so customers enter their card details directly on the merchant page instead of being redirected. See [Onsite Checkout](#onsite-checkout) for setup details. -- `wallet`: The Ottu Wallet payment method that allows customers to spend their stored balance at checkout. +- `wallet`: The M-Wallet payment method that allows customers to spend their stored balance at checkout. #### displayMode _`string`_ @@ -932,14 +932,14 @@ Checkout.init({
urpay button in Web SDK
-### Ottu Wallet +### M-Wallet -When a customer has wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. Wallet is hidden for authorize-only sessions. +When a customer has M-Wallet credit in the session currency, the SDK renders a **Wallet** payment method automatically — no init config is required. Pass the `customer_id` when creating the session, and either include `'wallet'` in `formsOfPayment` or omit `formsOfPayment` to show all available methods. M-Wallet is hidden for authorize-only sessions. -For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [Wallet section](/developers/payments/wallet/). +For full balance behavior, partial-payment rules, and the four-hour reservation auto-release, see the [M-Wallet section](/developers/payments/wallet/). -:::warning Cross-currency wallet payments are not supported -The wallet only appears when its currency matches the order currency. +:::warning Cross-currency M-Wallet payments are not supported +The M-Wallet only appears when its currency matches the order currency. ::: diff --git a/docs/developers/payments/index.md b/docs/developers/payments/index.md index 776b085..4e93cd1 100644 --- a/docs/developers/payments/index.md +++ b/docs/developers/payments/index.md @@ -30,11 +30,11 @@ Process payments directly when you manage your own UI — Apple Pay buttons, Goo [**Go to Native Payments →**](native-payments.md) -### Wallet (Stored Balance) +### M-Wallet (Stored Balance) -Refund payments to a customer's wallet balance instead of returning funds via the original gateway. Customers can spend wallet credit at any future Ottu checkout in the same currency — fully or partially alongside another payment method. +Refund payments to a customer's M-Wallet balance instead of returning funds via the original gateway. Customers can spend M-Wallet credit at any future Ottu checkout in the same currency — fully or partially alongside another payment method. -[**Go to Wallet →**](wallet/index.mdx) +[**Go to M-Wallet →**](wallet/index.mdx) ### Sandbox & Test Cards diff --git a/docs/developers/payments/payment-methods.md b/docs/developers/payments/payment-methods.md index fd16593..95f2f4d 100644 --- a/docs/developers/payments/payment-methods.md +++ b/docs/developers/payments/payment-methods.md @@ -27,8 +27,8 @@ Ottu offers SDKs and tools to speed up your integration. See [Getting Started](/ The Payment Methods API is a foundation for other Ottu APIs. It returns detailed information about each available payment method — supported operations, wallet integrations, currencies, and tokenization capabilities — giving you the data needed to create payment sessions with the right gateways. -:::tip Wallet as a payment method -When a customer has positive wallet balance in the session currency, a method with `type: "wallet"` appears in the response. See [Wallet](/developers/payments/wallet/) for the full integration. +:::tip M-Wallet as a payment method +When a customer has positive M-Wallet balance in the session currency, a method with `type: "wallet"` appears in the response. See [M-Wallet](/developers/payments/wallet/) for the full integration. ::: ### Workflow diff --git a/docs/developers/payments/wallet/index.mdx b/docs/developers/payments/wallet/index.mdx index 0ecd5ac..f5c1f19 100644 --- a/docs/developers/payments/wallet/index.mdx +++ b/docs/developers/payments/wallet/index.mdx @@ -1,6 +1,6 @@ --- -title: Wallet -description: Customer wallet credits — refund, store, and spend balances at checkout. +title: M-Wallet +description: Customer M-Wallet credits — refund, store, and spend balances at checkout. toc_min_heading_level: 2 toc_max_heading_level: 3 hide_table_of_contents: true @@ -17,11 +17,11 @@ import { developerWalletScenariosSteps } from "@site/src/data/wallet-scenarios"; import FAQ, { FAQItem } from "@site/src/components/FAQ"; import { OTTU_CONNECT_BASE_URL } from "@site/src/constants/api"; -# Wallet +# M-Wallet -Wallet lets you refund customer payments to a stored balance keyed by merchant, customer, and currency, then let the customer spend that credit at any future Ottu checkout in the same currency. No PII is stored on the wallet service. +M-Wallet (merchant wallet) lets you refund customer payments to a stored balance keyed by merchant, customer, and currency, then let the customer spend that credit at any future Ottu checkout in the same currency. No PII is stored on the M-Wallet service. -Authentication for merchant-facing endpoints follows the standard [Ottu API key](/developers/getting-started/authentication) flow — the same key you use for the [Checkout API](../checkout-api). Service-to-service auth between Ottu Connect and the wallet service uses OAuth 2.0 internally and is invisible to merchants. +Authentication for merchant-facing endpoints follows the standard [Ottu API key](/developers/getting-started/authentication) flow — the same key you use for the [Checkout API](../checkout-api). Service-to-service auth between Ottu Connect and the M-Wallet service uses OAuth 2.0 internally and is invisible to merchants. :::note Base URL Every API call in this guide targets {OTTU_CONNECT_BASE_URL}. Swap in your own merchant domain when you integrate. @@ -35,8 +35,8 @@ Ottu offers SDKs and tools to speed up your integration. See [Getting Started](. - Refunding without returning funds to the original card or gateway — loyalty, goodwill, or voucher use cases. - Letting customers carry over balance between sessions. -- Reducing payment-gateway fees by spending wallet credit before charging a card. -- Multi-currency merchants — each currency maintains its own wallet account. +- Reducing payment-gateway fees by spending M-Wallet credit before charging a card. +- Multi-currency merchants — each currency maintains its own M-Wallet account. ## Guide @@ -44,27 +44,27 @@ Ottu offers SDKs and tools to speed up your integration. See [Getting Started](. -Wallet credit is created when a merchant refunds with `destination: "wallet"` — see [Refund to Wallet](../../operations#refund-to-wallet). Once a customer has positive balance in the session currency, the developer journey to spend it is: +M-Wallet credit is created when a merchant refunds with `destination: "wallet"` — see [Refund to M-Wallet](../../operations#refund-to-m-wallet). Once a customer has positive balance in the session currency, the developer journey to spend it is: -1. **Filter the payment methods** — call the [Payment Methods API](../payment-methods) with `payment_services: ["wallet"]` to get the wallet-capable `pg_codes`. -2. **Create a Checkout session** — call the [Checkout API](../checkout-api) with those `pg_codes` and the `customer_id`. The `customer_id` is what binds the session to that customer's wallet account. -3. **Initialize the Checkout SDK** — the SDK fetches the wallet balance from Ottu Connect and renders "Wallet (X.XXX CCC)" alongside the other payment methods. -4. **Customer applies wallet on submit** — Ottu Connect reserves the required amount (or the full balance, whichever is lower). Any shortfall is charged through the selected gateway. +1. **Filter the payment methods** — call the [Payment Methods API](../payment-methods) with `payment_services: ["wallet"]` to get the M-Wallet-capable `pg_codes`. +2. **Create a Checkout session** — call the [Checkout API](../checkout-api) with those `pg_codes` and the `customer_id`. The `customer_id` is what binds the session to that customer's M-Wallet account. +3. **Initialize the Checkout SDK** — the SDK fetches the M-Wallet balance from Ottu Connect and renders "Wallet (X.XXX CCC)" alongside the other payment methods. +4. **Customer applies M-Wallet on submit** — Ottu Connect reserves the required amount (or the full balance, whichever is lower). Any shortfall is charged through the selected gateway. 5. **Commit or release** — on success the reservation commits to a debit entry; on abandon, cancel, or failure it auto-releases after about four hours. ### Live Demo -Try the wallet flow below. The demo discovers a wallet-capable gateway, seeds a fresh customer's wallet through the docs backend, creates a Checkout session, and mounts the SDK so you can pay with wallet. Screenshots of the merchant-side flow are on the [business wallet pages](/business/wallet/). +Try the M-Wallet flow below. The demo discovers an M-Wallet-capable gateway, seeds a fresh customer's M-Wallet through the docs backend, creates a Checkout session, and mounts the SDK so you can pay with M-Wallet. Screenshots of the merchant-side flow are on the [business M-Wallet pages](/business/wallet/). ### Step-by-Step -#### 1. List the wallet-capable payment gateways +#### 1. List the M-Wallet-capable payment gateways -Call the [Payment Methods API](../payment-methods) (`POST /b/pbl/v2/payment-methods/`) with `payment_services: ["wallet"]` to filter the gateway list to those that support wallet payments. Use these `pg_codes` when creating the Checkout session. +Call the [Payment Methods API](../payment-methods) (`POST /b/pbl/v2/payment-methods/`) with `payment_services: ["wallet"]` to filter the gateway list to those that support M-Wallet payments. Use these `pg_codes` when creating the Checkout session. -{`curl --location '${OTTU_CONNECT_BASE_URL}/b/pbl/v2/payment-methods/' \\ +{`curl --location '${OTTU_CONNECT_BASE_URL}/b/pbl/v2/payment-methods/' \\ --header 'Authorization: Api-Key ' \\ --header 'Content-Type: application/json' \\ --data '{ @@ -75,7 +75,7 @@ Call the [Payment Methods API](../payment-methods) (`POST /b/pbl/v2/payment-meth "tags": ["demo"] }'`} -```json title="Example response (wallet-enabled PG)" +```json title="Example response (M-Wallet-enabled PG)" { "customer_payment_methods": [], "payment_methods": [ @@ -97,16 +97,16 @@ Call the [Payment Methods API](../payment-methods) (`POST /b/pbl/v2/payment-meth ``` :::note `customer_id` filter -You don't need `customer_id` to discover wallet-capable gateways generically. If you do pass `customer_id` and that customer has a wallet enabled in the session currency, the wallet entry will be returned alongside the standard payment methods. To narrow the gateway list to wallet-capable PGs for later refunds, use `payment_services: ["wallet"]` as shown above. +You don't need `customer_id` to discover M-Wallet-capable gateways generically. If you do pass `customer_id` and that customer has an M-Wallet enabled in the session currency, the M-Wallet entry will be returned alongside the standard payment methods. To narrow the gateway list to M-Wallet-capable PGs for later refunds, use `payment_services: ["wallet"]` as shown above. ::: For the full request/response reference, headers, error codes, and supported filters, see the [Payment Methods API page](../payment-methods). -#### 2. Create a Checkout session with the wallet-capable PGs +#### 2. Create a Checkout session with the M-Wallet-capable PGs -Call the [Checkout API](../checkout-api) with the `pg_codes` returned in step 1, plus the `customer_id` to enable the customer's wallet on this session. The response includes a `session_id` that you pass to the SDK in the next step. +Call the [Checkout API](../checkout-api) with the `pg_codes` returned in step 1, plus the `customer_id` to enable the customer's M-Wallet on this session. The response includes a `session_id` that you pass to the SDK in the next step. -{`curl --location '${OTTU_CONNECT_BASE_URL}/b/checkout/v1/pymt-txn/' \\ +{`curl --location '${OTTU_CONNECT_BASE_URL}/b/checkout/v1/pymt-txn/' \\ --header 'Authorization: Api-Key ' \\ --header 'Content-Type: application/json' \\ --data '{ @@ -126,7 +126,7 @@ Call the [Checkout API](../checkout-api) with the `pg_codes` returned in step 1, "expiration_time": "00:30:00" }`} -The `session_id` returned here is what step 3 passes into `Checkout.init`. The `customer_id` is what links the session to that customer's wallet account — wallet appears in the SDK only when (a) the session has a `customer_id` and (b) the wallet account for `(merchant, customer_id, currency)` has positive balance. +The `session_id` returned here is what step 3 passes into `Checkout.init`. The `customer_id` is what links the session to that customer's M-Wallet account — M-Wallet appears in the SDK only when (a) the session has a `customer_id` and (b) the M-Wallet account for `(merchant, customer_id, currency)` has positive balance. :::warning Only one wallet per provider may be available per checkout When you list several payment gateways in `pg_codes`, Ottu checks the wallets behind them. If two or more of the selected gateways each carry a wallet from the **same wallet provider** that can be used for the transaction's currency, the checkout creation request is rejected with **HTTP 400** — the checkout page could not unambiguously show which wallet balance to apply. Choose your `pg_codes` so that at most one wallet per provider is available for the transaction. @@ -164,7 +164,7 @@ Add a mount point to your page — the SDK looks for an element matching `select Then initialize the SDK with the `session_id` returned by step 2: -{`Checkout.init({ +{`Checkout.init({ selector: "checkout", merchant_id: "${OTTU_CONNECT_BASE_URL.replace("https://", "")}", // use your merchant id apiKey: "YOUR_API_PUBLIC_KEY", @@ -172,29 +172,29 @@ Then initialize the SDK with the `session_id` returned by step 2: formsOfPayment: ["wallet", "ottu-sandbox"], // or omit to show all });`} -#### 4. Customer applies wallet credit at checkout +#### 4. Customer applies M-Wallet credit at checkout -The SDK reserves the required amount (or the full balance, whichever is lower). If the session amount exceeds the wallet balance, the customer is prompted to pick a second method for the remainder. On submit, all reservations confirm together. On success the wallet entry commits; on cancel, error, or four-hour timeout it auto-releases. +The SDK reserves the required amount (or the full balance, whichever is lower). If the session amount exceeds the M-Wallet balance, the customer is prompted to pick a second method for the remainder. On submit, all reservations confirm together. On success the M-Wallet entry commits; on cancel, error, or four-hour timeout it auto-releases. -#### 5. (Optional) Read wallet state from your backend +#### 5. (Optional) Read M-Wallet state from your backend -Reading wallet state from your backend is optional — the same balance, ledger, and operation views are available in the [Ottu dashboard](/business/wallet/). Use the read APIs only if you want to surface wallet operations to your end customers in your own UI. See the [API Reference](#api-reference) section below. +Reading M-Wallet state from your backend is optional — the same balance, ledger, and operation views are available in the [Ottu dashboard](/business/wallet/). Use the read APIs only if you want to surface M-Wallet operations to your end customers in your own UI. See the [API Reference](#api-reference) section below. ### Use Cases -#### Partial payments (wallet plus another method) +#### Partial payments (M-Wallet plus another method) Three balance-versus-amount cases: -| Wallet balance vs amount | Behavior | +| M-Wallet balance vs amount | Behavior | |---|---| -| Balance ≥ amount | Only `amount` is deducted. Surplus stays in the wallet. | -| Balance == amount | Wallet fully covers; balance becomes 0. | +| Balance ≥ amount | Only `amount` is deducted. Surplus stays in the M-Wallet. | +| Balance == amount | M-Wallet fully covers; balance becomes 0. | | Balance < amount | Full balance is consumed; customer pays the difference with another method. | -Customers cannot choose how much wallet credit to apply — Ottu computes it automatically. +Customers cannot choose how much M-Wallet credit to apply — Ottu computes it automatically. #### Reservation lifecycle @@ -202,27 +202,27 @@ Customers cannot choose how much wallet credit to apply — Ottu computes it aut - **Committed** on payment success. - **Released automatically** about four hours after an abandoned, cancelled, or failed payment. No human intervention. -#### Wallet hidden for authorize-only sessions +#### M-Wallet hidden for authorize-only sessions -When the session is configured for authorization-only (no immediate capture), wallet is not offered as a payment method. Wallet supports immediate-capture flows only. +When the session is configured for authorization-only (no immediate capture), M-Wallet is not offered as a payment method. M-Wallet supports immediate-capture flows only. -#### Refunding to wallet +#### Refunding to M-Wallet -See [Refund to Wallet](../../operations#refund-to-wallet) on the Operations page for the full API and behavior. The refund endpoint accepts `destination: "wallet"` to credit the wallet instead of reversing through the gateway. +See [Refund to M-Wallet](../../operations#refund-to-m-wallet) on the Operations page for the full API and behavior. The refund endpoint accepts `destination: "wallet"` to credit the M-Wallet instead of reversing through the gateway. -:::warning Wallet-paid transactions cannot be refunded -A transaction settled with wallet credit cannot be refunded back to the wallet — or to any other destination. Once a customer spends their balance at checkout, that leg of the payment is final. +:::warning M-Wallet-paid transactions cannot be refunded +A transaction settled with M-Wallet credit cannot be refunded back to the M-Wallet — or to any other destination. Once a customer spends their balance at checkout, that leg of the payment is final. ::: -:::warning Cross-currency wallet payments are not supported -A KWD wallet cannot be used to pay a SAR order, and vice versa. Each currency maintains a separate wallet account. +:::warning Cross-currency M-Wallet payments are not supported +A KWD M-Wallet cannot be used to pay a SAR order, and vice versa. Each currency maintains a separate M-Wallet account. ::: #### Wallet Transactions -When a payment is settled with wallet credit, the payment details — returned by the [Checkout API retrieve](../checkout-api) call, the [PSQ inquiry](../psq), and [payment webhooks](../../webhooks/payment-events#response-payment-webhook-customer_wallet_transactions) — include a `customer_wallet_transactions` array. Each element is one wallet leg that contributed to the payment, so you can attribute every leg without a separate call to the wallet read APIs. +When a payment is settled with wallet credit, the payment details — returned by the [Checkout API retrieve](../checkout-api) call, the [PSQ inquiry](../psq), and [payment webhooks](../../webhooks/payment-events#response-payment-webhook-customer_wallet_transactions) — include a `customer_wallet_transactions` array. Each element is one wallet leg that contributed to the payment, so you can attribute every leg without a separate call to the M-Wallet read APIs. -The key is omitted entirely when no wallet was involved. A single-wallet payment emits a one-element list; multi-wallet stacking (Ottu credit plus a loyalty wallet, for example) emits one element per provider. +The key is omitted entirely when no wallet was involved. A single-wallet payment emits a one-element list; multi-wallet stacking (M-Wallet credit plus a loyalty wallet, for example) emits one element per provider. | Field | Type | Description | |---|---|---| @@ -259,11 +259,11 @@ Use these fields to keep your own system in sync: - **Audit trail** — store `operation_id` against your order. Pass it to [Get Operation by ID](#api-reference) to pull every ledger entry the operation produced for a full audit record. - **System updates** — use `provider_code` to attribute the credit to the correct wallet program, and `created_at` / `modified_at` to timestamp the movement in your own ledger. -Stacked-wallet setups (e.g., Ottu wallet + Qitaf) emit one record per provider in the same payload; single-wallet payments emit a one-element list — so you can reconcile multi-wallet payments without polling the wallet read APIs. +Stacked-wallet setups (e.g., M-Wallet + Qitaf) emit one record per provider in the same payload; single-wallet payments emit a one-element list — so you can reconcile multi-wallet payments without polling the M-Wallet read APIs. ## API Reference -Three read APIs let you query wallet state from your backend. All three accept the standard [Ottu API key](/developers/getting-started/authentication) authentication and are `POST` endpoints — the request body carries the `customer_id` (and, where required, the `currency`) that scopes the query. +Three read APIs let you query M-Wallet state from your backend. All three accept the standard [Ottu API key](/developers/getting-started/authentication) authentication and are `POST` endpoints — the request body carries the `customer_id` (and, where required, the `currency`) that scopes the query. @@ -288,43 +288,43 @@ Three read APIs let you query wallet state from your backend. All three accept t - **Discover per session.** Always call [Payment Methods API](../payment-methods) per session — don't assume balance from a prior call. - **Display balance fresh.** Call List Accounts on page load if you show balance in your own UI. Cache only briefly; balance changes on every payment. - **Append-only ledger.** Never derive balance client-side from history — rely on the Accounts endpoint for authoritative balance. -- **Match the currency.** For multi-currency merchants, present the wallet matching the session currency only. +- **Match the currency.** For multi-currency merchants, present the M-Wallet matching the session currency only. ## FAQ - + No. Ottu computes the amount automatically based on session amount versus balance. It is automatically released about four hours after the abandoned, cancelled, or failed payment. No human intervention is required. - - No. Wallet supports immediate-capture sessions only. + + No. M-Wallet supports immediate-capture sessions only. - - The original payment session is linked to the wallet credit entry, visible in both the wallet ledger and the operation log. + + The original payment session is linked to the M-Wallet credit entry, visible in both the M-Wallet ledger and the operation log. - + No. The service holds only ledger entries scoped by `merchant_id`, `customer_id`, and `currency`. - - Not at the moment. The wallet is only exposed as a form of payment through the [Checkout SDK](../checkout-sdk/) — create a session with the Checkout API, mount the SDK, and the wallet appears alongside the other configured payment methods. + + Not at the moment. The M-Wallet is only exposed as a form of payment through the [Checkout SDK](../checkout-sdk/) — create a session with the Checkout API, mount the SDK, and the M-Wallet appears alongside the other configured payment methods. - - The wallet is charged through the regular session-then-pay flow: create a session with the Checkout API, then mount the [Checkout SDK](../checkout-sdk/) — the wallet appears as a form of payment as described above. + + The M-Wallet is charged through the regular session-then-pay flow: create a session with the Checkout API, then mount the [Checkout SDK](../checkout-sdk/) — the M-Wallet appears as a form of payment as described above. - - No. Wallet credit does not expire. + + No. M-Wallet credit does not expire. - The payment webhook payload includes a [`customer_wallet_transactions`](../../webhooks/payment-events#response-payment-webhook-customer_wallet_transactions) array — one entry per wallet provider that contributed to the payment. For stacked-wallet setups (e.g., Ottu wallet + Qitaf), each provider emits its own entry; single-wallet payments emit a one-element list. + The payment webhook payload includes a [`customer_wallet_transactions`](../../webhooks/payment-events#response-payment-webhook-customer_wallet_transactions) array — one entry per wallet provider that contributed to the payment. For stacked-wallet setups (e.g., M-Wallet + Qitaf), each provider emits its own entry; single-wallet payments emit a one-element list. ## What's Next? -- [Refund to Wallet (Operations)](../../operations#refund-to-wallet) — the refund API change that creates wallet credits. -- [Checkout SDK — Ottu Wallet section](../checkout-sdk/web#ottu-wallet) — how wallet appears in the SDK. +- [Refund to M-Wallet (Operations)](../../operations#refund-to-m-wallet) — the refund API change that creates M-Wallet credits. +- [Checkout SDK — M-Wallet section](../checkout-sdk/web#m-wallet) — how M-Wallet appears in the SDK. - [Payment Methods API](../payment-methods) — discovering available payment methods. -- [Wallet for merchants](/business/wallet/) — business-side documentation. +- [M-Wallet for merchants](/business/wallet/) — business-side documentation. diff --git a/sidebars.ts b/sidebars.ts index 8f03ee1..b3bbcd0 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -209,7 +209,7 @@ const sidebars: SidebarsConfig = { }, { type: "category", - label: "Wallet", + label: "M-Wallet", link: { type: "doc", id: "developers/payments/wallet/index" }, items: [ { @@ -601,13 +601,13 @@ const sidebars: SidebarsConfig = { }, { type: "category", - label: "Wallet", + label: "M-Wallet", link: { type: "doc", id: "business/wallet/index" }, items: [ { type: "link", - label: "Why use Wallet", - href: "/business/wallet#why-use-wallet", + label: "Why use M-Wallet", + href: "/business/wallet#why-use-m-wallet", }, { type: "link", @@ -616,13 +616,13 @@ const sidebars: SidebarsConfig = { }, { type: "link", - label: "Refund to Wallet", - href: "/business/wallet#refund-to-wallet", + label: "Refund to M-Wallet", + href: "/business/wallet#refund-to-m-wallet", }, { type: "link", - label: "Wallet at Checkout", - href: "/business/wallet#wallet-at-checkout", + label: "M-Wallet at Checkout", + href: "/business/wallet#m-wallet-at-checkout", }, { type: "link", @@ -631,8 +631,8 @@ const sidebars: SidebarsConfig = { }, { type: "link", - label: "Wallet Reporting", - href: "/business/wallet#wallet-reporting", + label: "M-Wallet Reporting", + href: "/business/wallet#m-wallet-reporting", }, { type: "link", diff --git a/src/components/WalletDemo/WalletDemoInner.tsx b/src/components/WalletDemo/WalletDemoInner.tsx index 5396ef5..ce9ee9d 100644 --- a/src/components/WalletDemo/WalletDemoInner.tsx +++ b/src/components/WalletDemo/WalletDemoInner.tsx @@ -63,8 +63,8 @@ function reducer(state: State, action: Action): State { } const STEPS = [ - "Fetching wallet-capable payment methods...", - "Seeding wallet balance...", + "Fetching M-Wallet-capable payment methods...", + "Seeding M-Wallet balance...", "Creating payment session...", "Loading Checkout SDK...", ]; @@ -111,7 +111,7 @@ export default function WalletDemoInner() { if (pgCodes.length === 0) { dispatch({ type: "ERROR", - message: `No wallet-capable gateways for ${WALLET_DEMO.currency} on the active merchant. Enable a PG with payment_services: ["wallet"] tagged "demo".`, + message: `No M-Wallet-capable gateways for ${WALLET_DEMO.currency} on the active merchant. Enable a PG with payment_services: ["wallet"] tagged "demo".`, }); return; } @@ -168,9 +168,9 @@ export default function WalletDemoInner() {
{state.status === "idle" && (
-

Try Wallet at Checkout

+

Try M-Wallet at Checkout

- Seed a fresh customer's wallet through the docs backend, then pay with it in + Seed a fresh customer's M-Wallet through the docs backend, then pay with it in the embedded SDK. No real charges.