> Portal Navigation: > > - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version. > - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages). > - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`). > - Top-level index of all portals: https://dev.wix.com/docs/llms.txt > - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt # Method name: markAsPaid(_id: string) # Method package: wixPricingPlansV2 # Method menu location: wixPricingPlansV2 --> orders --> markAsPaid # Method Link: https://dev.wix.com/docs/velo/apis/wix-pricing-plans-v2/orders/mark-as-paid.md # Method Description: Marks an offline order as paid. > __Note__: Marking separate payment cycles as paid is not yet supported. The entire order will be marked as paid. Subsequent offline payments do trigger events and emails, but are not registered as additional offline payments. Marking an offline order as paid causes the following changes: - The order's `lastPaymentStatus` changes to `"PAID"`. - The order's status changes to either `"PENDING"` or `"ACTIVE"`, depending on the order's `startDate`. An error occurs if you attempt to: - Mark an already-paid, offline order as paid. You cannot mark an offline order as paid twice. - Mark an online order as paid. The Mark as Paid method is supported for offline orders only. # Method Code Examples: *** Note: do not assume any prop names or enum values other than the ones in the example. ## Mark an order as paid (dashboard page code) ```javascript import { orders } from 'wix-pricing-plans.v2'; import { elevate } from 'wix-auth'; /* Sample _id value: '82d99338-5653-459a-a751-b57483f7cfb5' */ const elevatedMarkAsPaid = elevate(orders.markAsPaid); export async function myMarkAsPaidFunction(_id) { try { await elevatedMarkAsPaid(_id); return; } catch (error) { console.error(error); // Handle the error } } /* Promise resolves to void */ ``` ## Mark an order as paid (export from backend code) ```javascript import { Permissions, webMethod } from 'wix-web-module'; import { orders } from 'wix-pricing-plans.v2'; import { elevate } from 'wix-auth'; // Sample _id value: '82d99338-5653-459a-a751-b57483f7cfb5' const elevatedMarkAsPaid = elevate(orders.markAsPaid); export const myMarkAsPaidFunction = webMethod(Permissions.Anyone, async (_id) => { try { await elevatedMarkAsPaid(_id); return; } catch (error) { console.error(error); // Handle the error } }); /* Promise resolves to void */ ``` ## Manager cancellation or updated payment status of multiple orders ```javascript /******************************* * Backend code - utils.web.js * *******************************/ import { Permissions, webMethod } from 'wix-web-module'; import { orders } from 'wix-pricing-plans.v2'; import { elevate } from 'wix-auth'; const elevatedManagementListOrders = elevate(orders.managementListOrders); const elevatedCancelOrder = elevate(orders.cancelOrder); const elevatedMarkAsPaid = elevate(orders.markAsPaid); export const getUnpaidOrders = webMethod( Permissions.Anyone, async () => { const options = { paymentStatuses: 'UNPAID' }; try { const ordersList = await elevatedManagementListOrders(options); return ordersList; } catch (error) { console.error(error); // Handle the error } }); export const cancelOrder = webMethod( Permissions.Anyone, async (orderId) => { const effectiveAt = 'NEXT_PAYMENT_DATE'; try { await elevatedCancelOrder(orderId, effectiveAt); return; } catch (error) { console.error(error); // Handle the error } }); export const markAsPaid = webMethod( Permissions.Anyone, async (orderId) => { try { await elevatedMarkAsPaid(orderId); return; } catch (error) { console.error(error); // Handle the error } }); /************* * Page code * *************/ import { getUnpaidOrders, cancelOrder, markAsPaid } from 'backend/utils.web'; $w.onReady(function () { $w('#ordersCheckbox').hide(); $w('#markAsPaidBtn').disable(); $w('#cancelOrderBtn').disable(); populateOrdersCheckbox(); let orderValues; $w('#ordersCheckbox').onChange(() => { orderValues = $w('#ordersCheckbox').value; }); // Cancel multiple orders $w('#cancelOrderBtn').onClick(() => { orderValues.forEach(async (orderId) => { await cancelOrder(orderId); }); }); // Mark multiple orders as paid $w('#markAsPaidBtn').onClick(() => { orderValues.forEach(async (orderId) => { await markAsPaid(orderId); }); }); }); async function populateOrdersCheckbox() { const unpaidOrders = await getUnpaidOrders(); // Displays each order with its corresponding member ID $w('#ordersCheckbox').options = unpaidOrders.orders.map(item => { return { label: `${item.planName} - memberId: ${item.buyer.memberId}`, value: item._id } }); $w('#ordersCheckbox').show(); $w('#markAsPaidBtn').enable(); $w('#cancelOrderBtn').enable(); } ``` ## Create an offline order for an existing member ```javascript /******************************* * Backend code - utils.web.js * *******************************/ import { Permissions, webMethod } from 'wix-web-module'; import { orders, plans } from 'wix-pricing-plans.v2'; import { elevate } from 'wix-auth'; const elevatedListPublicPlans = elevate(plans.listPublicPlans); const elevatedCreateOfflineOrder = elevate(orders.createOfflineOrder); const elevatedMarkAsPaid = elevate(orders.markAsPaid); export const listPublicPlans = webMethod( Permissions.Anyone, async () => { try { const plansResponse = await elevatedListPublicPlans(); const plans = plansResponse.plans; return plans; } catch (error) { console.error(error); // Handle the error } }); export const createOfflineOrder = webMethod( Permissions.Anyone, async (planId, memberId) => { try { const newOrder = await elevatedCreateOfflineOrder(planId, memberId); return newOrder; } catch (error) { console.error(error); // Handle the error } }); export const markAsPaid = webMethod( Permissions.Anyone, async (orderId) => { try { await elevatedMarkAsPaid(orderId); return; } catch (error) { console.error(error); // Handle the error } }); /************* * Page code * *************/ import { createOfflineOrder, listPublicPlans, markAsPaid } from 'backend/utils.web'; import { members } from 'wix-members.v2'; $w.onReady(async function () { $w('#newOrderBtn').disable(); await populatePlansDropdown(); let planId; let memberId; // Populate #membersDropdown const membersQueryResults = await members.queryMembers().find(); $w('#membersListDropdown').options = membersQueryResults.items.map(member => { return { label: member.profile.nickname, value: member._id } }); $w('#membersListDropdown').onChange(() => { memberId = $w('#membersListDropdown').value; }); $w('#plansDropdown').onChange(() => { planId = $w('#plansDropdown').value; $w('#newOrderBtn').enable(); }); $w('#newOrderBtn').onClick(async () => { const newOrder = await createOfflineOrder(planId, memberId); const orderId = newOrder.orders._id; markAsPaid(orderId); }); }); async function populatePlansDropdown() { const plans = await listPublicPlans(); $w('#plansListDropdown').options = plans.map((item) => { return { label: item.name, value: item._id } }); } ``` ---