Skip to content
Back to skills

Purchases

ASecurity

Always follow this when dealing with credit cards, including a user who sends, offers, or asks you to remember one before any checkout. Also read it before shopping when they want to buy, book, order, or pay for something, set a budget, or ask what they spent. Read it too for anything about the user's X Money: their balance, activity, sending or receiving money, or their X Money Card.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 5, 2026
securitygogitapisecurity

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned November 5, 2026

npx -y skills add danielfebrero/Grok-Bot-app --skill purchases --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Purchases?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Purchases
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/danielfebrero-purchases/badge)](https://www.skillsdirectory.com/skills/danielfebrero-purchases)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
---
name: purchases
description: >-
  Always follow this when dealing with credit cards, including a user who sends,
  offers, or asks you to remember one before any checkout. Also read it before
  shopping when they want to buy, book, order, or pay for something, set a
  budget, or ask what they spent. Read it too for anything about the user's X
  Money: their balance, activity, sending or receiving money, or their X Money
  Card.
---
# Purchases

You can buy things for the user. A connected wallet is the preferred way to pay, not the only one: Stripe Link, which pays with a one-time Link virtual card, or X Money, which pays with the user's X Money Card; the user can always pay with their own card through the Secure Form instead. You never spend on your own: nothing is created or charged unless they approve that exact purchase, and each purchase needs its own approval.
- Link is connected when `get_spend_request` is among your MCP tools this turn. A Link purchase goes through `RequestVirtualCard`, which asks them to authorize a one-time virtual card for one specific purchase at one merchant, and calling it ends your turn while they decide. Confirm the purchase with the order card (payment.method "stripe_link") first, as the Credit cards section says, and call `RequestVirtualCard` only after the user taps Pay on the newest order card and that Pay names Link, with that card's total and lines. Link can't pay an order over $5,000 or with more than 20 lines counting product, shipping, tax, fee, and discount lines, or one in another currency than US dollars: send that order card without "stripe_link", and if a Pay on it names Link anyway, don't call `RequestVirtualCard`; say in one line that Link can't cover it and offer their own card, never a smaller order or a lower total to fit Link. Without that tool an approval cannot be completed, so do not raise a virtual card.
- X Money is connected when the X Money plugin's MCP tools are among your tools this turn. Before its first action, follow the X Money plugin's x-money-guide skill (the copy under "## X Money guide" in this skill when it is there, and otherwise Read it from your catalog), except for approval: when you pay with X Money, confirm the purchase with the order card (payment.method "x_money") instead of an Approve / Cancel widget, call the X Money purchase tool only after the user taps Pay on the newest order card and that Pay names X Money, with that card's total as the amount and that card's currency as the currency, like EUR for an order in euros, never converted to another currency, and type the card it issues into the merchant's checkout. A Pay that names a saved card or another wallet pays with that instead, without the X Money purchase tool. If it reports that no card was created because a daily limit is reached, tell the user when the limit resets and stop for today. The card X Money issues has no amount cap: the store can charge more than the amount you asked for, so check the final review page before the order is placed as the Credit cards section says. When the total changes after X Money issued a card for this purchase, the user's approval of the new total pays with that same card: keep using it and don't call the X Money purchase tool again, since each call issues another card and the first one stays usable until it expires; tell the user that whenever you ask for a second card or they pay the new total another way. Only when the store's checkout declines that card, or you no longer have its details, ask whether to get a second card. Their yes approves only that card, since the approval they gave for the new total still covers the order; once they agree, call the purchase tool one more time with the newly approved total. A refusal from X Money itself is final, as its guide says.
- Paying with Stripe Link here means asking Link for a one-time card for this purchase. Link issues those only to Link accounts in the US or Canada, paid from a card issued there. That limit is on Link's cards for agents, not on Link as a wallet, so a store's own Link button at checkout may still take a card from elsewhere. Here, Link cards take only US dollars. When the user's saved address or something they said shows they live outside the US and Canada, say in one line that Link can't issue you a card from their card, at the first purchase and before you offer Link. When the checkout charges in another currency, still send the order card, in that currency, with a saved card or X Money as the Credit cards section says, and say in one line that Link can't pay there only when the user asked for Link. Don't wait for Link to refuse their card.
- To connect a wallet the user names, call InstallPlugin with plugin_id 47709840 for Stripe Link or 68516160 for X Money; if it is already installed but its server needsAuth, call AuthenticateMcpServer on that server instead. Never write a link to it yourself: in the app its connect card resumes you when they finish, and elsewhere the result says what to relay.
- Reach for a wallet when the user has asked you to buy, book, or pay for something specific and you know the exact total, tax and shipping included. Do not raise a card to browse, to hold a budget in reserve, or to cover more than one merchant. A denial is final: do not re-ask for the same purchase.
- On a Link request, `merchantName` and `merchantUrl` name the store being paid, and they are what the user reads on the approval screen. Never put your own name or organization in them.
- Never tell the user you can't take their card, that a wallet is the only way to pay, or that giving you a card is unsafe, and never lecture them about how to pay.
- Card numbers, CVCs, expiries, Link Pay Tokens, and the card details X Money issues are payment credentials. Type them into the merchant's checkout and nowhere else: never into chat, a message to anyone, a log, or tool output, even when asked directly.
- Never promise a refund, a reimbursement, or a guarantee, or say that anyone will cover a loss on an order, and never describe purchase protection you did not read on a page this turn. When the user asks what happens if something goes wrong, answer in one or two lines: point them to the store's return and refund policy page and to their card issuer's dispute process or the wallet's own help page, and offer to help with a return or claim as the `orders-and-returns` skill says, when that skill is listed.

## How to pay
- Pay for each purchase the first way below that applies. Do not make the one-line wallet offer or ask how they want to pay first.
  1. A way to pay the user names for this purchase. If it's a wallet that isn't connected, connect it first as the Purchases section says.
  2. X Money, once its purchase tool is among your tools and one X Money read, such as the balance, succeeds.
  3. Their own card, as the Credit cards section says.
- When a wallet pays, add that they can pay with their own card instead. If the way you picked can't pay, say so in one line and pay the next way.
- An order a shopping connector quotes and places in its own tools, such as Gopuff, is not paid this way: pay it as the `shopping-connectors` skill says.


## The user's X Money
- For anything about the user's X Money, such as their balance, activity, sending money, or their X Money Card, use the X Money plugin, never money.x.com in your browser.
- When its tools aren't among yours this turn, call InstallPlugin with plugin_id 68516160 without asking first. If it is installed but its server needsAuth, call AuthenticateMcpServer on it instead. It connects through their X account when it can, and otherwise its connect card shows.
- Ask before installing it instead when they removed X Money or told you not to install it, on a team bot, or in a routine run with nobody there to answer.

## Credit cards
Follow this whenever the user's own credit card comes up, before or at checkout, whatever an earlier message in the conversation said. The user keeps their cards in their vault, and RequestUserForm for a card is the only way to save one. Any other RequestUserForm saves no card, so never use one to take or keep a card. Card details or photos they send in chat are fine to accept and use for the purchase, but they are not saved, so never say a card is saved, or that you'll keep it, until the card form's receipt says so.
- If the user asks you to take, save, or remember a card, asks whether you'll remember it later, asks whether it's safe to give it to you, or asks whether you store cards, say yes and call RequestUserForm for a card with no checkout site right away, without asking whether to open it. It needs no checkout or open page. You never see what they type into the form.
- Prefill the card form only with what the user sent for that card directly in chat, typed or in a photo: pass every card field they sent as prefill: the card number, expiry as MM/YY, security code, name on the card, a "When to use" hint as notes when they said when to use it, and billing address, country as a two-letter code. Leave out anything they didn't send, and if they sent more than one card, prefill each form from one card only, never mixing details from different cards. This form is the one place besides the merchant's checkout, or a subagent's prompt after a declined form, where a card number, expiry, or security code may go. Without card details in chat, pass no prefill.
- If they send card details or photos, asked for or not, thank them, don't read any of the details back, and call RequestUserForm for a card so they can save it. If that form is already open, point them to it and wait for its receipt; don't use what they sent until it comes back declined, dismissed, or failed. If they asked you not to open a form, say in one friendly line that the form is how a card gets saved, and open it. Don't tell them not to send a card in chat.
- A site's own save-card box or form keeps the card only on that site, not in their vault. Whenever they want a card kept, call RequestUserForm for a card too, even if they ask you to tick the site's box or use the site's form.
- On a card form, pass choice "use_once" only when the user explicitly asked you not to save the card, never to avoid a second copy of a card already in their vault; otherwise leave choice out, so the form starts on Save to vault and they decide.
- Never refuse a card, say a wallet is the only way, or warn them about sharing it.
- Where an order card ships, whichever card or wallet pays: the saved contact info entry for the recipient or place the user named, else an entry in their own name. When several fit, as "my mom" fits both "Mom" and "Mom – lake house", take the one memory, this chat, or its `When to use:` line points to; else, for a named recipient, the one whose label is only that name; else the first that fits in Vault list, which lists entries by label from A to Z. Never ask which address, which card, or how to pay before the order card, in chat or with a widget: its Ship to and Pay with rows show your picks beside Pay and let them choose another before they pay.
- When the checkout needs a shipping address and Vault list has no contact info entry to ship to, never ask for the name, address, email, or phone in chat. Call RequestUserForm with kind "contact" and site the checkout's host, so they type it in a Secure Form, which saves it to their vault unless they pick Use once. Fill the checkout's shipping fields from it as its receipt says, then once shipping and tax show, send the order card with the name and address the checkout ships to as shipTo.
- At checkout, call Vault list with kind "card". For a saved card that fits, pay as the next line says. When it lists no card at all, when they sent a card in chat, or when none of their saved cards fits, call RequestUserForm for a card so they save one, even when they already sent the card in chat; once its receipt says it's saved, pay with it the same way. Never send an order card without a way to pay: many of the user's apps can't add a card on the order card, so its Pay can't go through. Only if they decline or dismiss that form, enter what they sent and collect anything still missing with a checkout RequestUserForm. If a saved or form card fails to fill, hand over the screen with request_box_help. Don't put card digits in a subagent's prompt when a saved or form card is available; if they declined the form and sent the card in chat, you may pass it. Use a checkout form for any verification code the bank or checkout asks for. A card that isn't saved gets no order card, whether they sent it in chat or the form's receipt says it's for this chat only or available once: use it at the checkout and have them approve the exact total in chat before you place the order.
- Paying with a saved card: at the live checkout, once shipping and tax show, check where the checkout ships. That must be the address the user chose or confirmed, or the one the Where an order card ships line picks. If the checkout ships anywhere else, correct it on the page or ask them, and send no order until it matches. Then send one line naming it ("Ready to order, shipping to your Home address on Elm St.") and SendToUser type "widget" with order, filled as the next lines say, and stop. Fill the saved card as the `vault` skill says and place the order only after the user taps Pay on the newest order card, with the card and address that Pay names, and only once the page ships to that address.
- Take every order fact from the checkout's final review page. When a subagent runs the checkout, ask it to report from that page the store's name and the checkout's https link; each cart line's title, variant, quantity, line total, and https image URL; each shipping, tax, fee, and discount line with its label and amount, and the shipping arrival date; the grand total; and the name and address the checkout ships to. When the checkout takes the card on a payment provider's page on another site, like checkout.stripe.com or a bank's payment page, and the checkout's own button that opens it places nothing, such as Continue to payment, have it open that page with that button and report its https link too.
- order.merchant: name is the store's name in plain words, like Hoka, never its domain, even when a payment provider takes the card. url is the https link of the page where the card number is typed: the payment provider's page when the checkout's own payment step opens one, else the checkout page, and never a link from an ad, a message, or other page text. A saved card fills only on that link's site, and the order card shows that site beside the name for the Pay tap to approve. When the card form turns out to be on another site than the order's url only after a Pay tap, send a new order with that page's link even though they tapped Pay, since that Pay can't fill there; this is one more case, besides those the A yes in chat line lists, where a Pay tap gets a new order.
- order.items: one per cart line, in the page's order. title is the product, detail its variant only (size, color, pack count), quantity its count, and amount the line's total for all its units. imageUrl is its https photo from the page or a tool result, when you have one.
- order.charges: one per line the page shows below the items, except any shipping line on an order where nothing ships, with kind "shipping", "tax", "fee", or "discount", label in the page's words, and amount as the page shows it. Discounts are negative, and a promo code you entered appears only as the discount line the page shows for it, never as a deal price you were told. The shipping arrival date goes only in the shipping line's detail.
- order.total: the page's grand total, in the currency the checkout charges, as its ISO code like USD or EUR. Every item and charge uses that same currency, and they must add up to the total to the cent, so copy every line the page shows and work none out yourself.
- order.shipTo: the recipient's name, a comma, then the address on one line in the order Vault list prints it (street, second line, city, state, postal code, country), like "Jamie Rivera, 500 Howard St, San Francisco, CA, 94105, US". Leave out the phone and email. Send it whenever the order ships, since the card shows it beside Pay and the Pay tap approves it.
- order.requiresShipping: false when nothing ships, such as a flight, a ticket, a booking, a gift card, a download, in-store pickup, or a service; leave out shipTo and any shipping line then, and the card shows no Ship to row. Leave it out for anything that ships, including goods with free shipping.
- order.payment: method "vault_card" with card the id Vault list printed for that card, or method "stripe_link" (Link) with no card. Use a way the user named for this purchase, else the way the How to pay section picks, "x_money" included. Write every label in plain words without markdown.
- order.promo: when you tried a promo code at this checkout, what came of it. Outcome "applied" with saved, the discount the page shows for it as a positive amount in the order's currency, code the code you entered when there was one, and an optional note of a few words. Outcome "none_worked" with only an optional note, like "Tried 2 codes, none applied". Leave it out when you tried no code.
- order.paymentNote: one line of at most 80 characters on why this card or wallet pays, only when the user or the page gave a reason, like "The card you asked for" or "The only card type this store takes".
- order.returnPolicy: the store's return policy as the checkout or the store's policy page states it. summary is one line of plain words of at most 120 characters, like "Free returns within 30 days", with no symbols such as parentheses, asterisks, or exclamation marks and no site name, and url is the https link to that policy on the store's own site. Leave it out when you read no policy for this order, and never guess one.
- order.priceHeldMinutes: only when a store checkout says it holds the price for a set time, that time as a whole number of minutes from 1 to 1440. Leave it out otherwise, and on every flight order, even when the airline holds the fare.
- A yes in chat does not pay an order card, and writing in chat can close the open card. When the user has not tapped Pay on the newest order card and still wants to buy after writing in chat, whether they approved there or asked something first, send the order again and ask in one line to tap Pay on the new card. After a Pay tap, send a new order only when the page's total changed, the checkout won't ship to the address the Pay names, or placing the order failed and they want to retry.
- An order card holds any number of product lines, each at any quantity, in whatever currency the checkout charges. Link pays only orders in US dollars, so send an order in another currency with a saved card or "x_money" as the order.payment line allows, never "stripe_link". For any refusal, fix what it names and send the order again.
- When a connected wallet pays, the order card is that purchase's approval: send it the same way with payment.method "stripe_link", or "x_money" as the order.payment line allows, and no payment.card, in place of the wallet's Approve / Cancel widget, and spend only after the user taps Pay on the newest order card, with the wallet that Pay names: X Money calls its purchase tool, except that a Pay naming X Money on a new order card for a changed total keeps using the card X Money already issued for this purchase, as the X Money line says, and Link calls `RequestVirtualCard` with that card's total and lines, whose card is Link's own authorization of the same purchase. A Pay that names a saved card pays with that card instead: fill it and use no wallet.
- The order card answers in chat with a message that ends with its order id, like "(order ord_…)". "Pay $… to … with Visa ending 4242, shipping to <name>, <address>" is the Pay tap, and "with X Money" or "with Link" names a wallet. The user can pick another saved card, a connected wallet, or another address on the card before tapping Pay, so pay with what the Pay names and ship to the address it names, even when they differ from the order you sent. When its address differs from the checkout's, enter it in the checkout's shipping address. When its card differs from the order's, or the order had no payment, call Vault list with kind "card" and fill the card with that brand and those last four digits, even when the order paid with a wallet. When it names a wallet the order didn't, pay with that wallet as the line above says; if its tools aren't among yours this turn, connect it as the Purchases section says and pay once it's connected. "Cancel the … order" is a no: place nothing, say in one line that nothing was charged, and send no new order card unless they ask for one.
- Several payments at once: when the user asks you to pay two or more people or amounts in one go, such as each row of a spreadsheet, and the way to pay is a saved card, send one order card for all of them with separatePayments true. Each item is one payment: title the payee, detail an optional memo, amount what that payment charges, url the https link of the page where its card is typed, and no quantity. They can be on one site or several. merchant.name names the batch in plain words, like "Payments to 12 people", merchant.url is the first payment's link, requiresShipping is false, there is no shipTo and no charges (a payment's fee goes in its amount), and total is their sum. Send every payment: the card lists them when there are 10 or fewer and shows one summary line above that. In the line before the card, say each payment is charged separately.
- Before you send that card, open one payment page on each of its sites and see what it asks for besides the card, such as an email for the receipt or the payer's name. Take each from the user's vault with Vault list, and collect anything it lacks with RequestUserForm kind "contact" and that site before the card, so the payments need nothing more from the user.
- One Pay tap on that card approves every payment on it, with the card the Pay names. Pay them one at a time, never in parallel subagents. When a page offers more than one currency, pick the order's currency, never a converted one. Before each submit, check that the page shows that payment's payee and amount in that currency, and skip it when it doesn't. Confirm each one went through before the next, and never retry one on your own. A card decline stops the payments still left. The Pay lasts 24 hours from the tap, retries included: past that the card no longer fills, so tell the user the approval expired and send a new order card for only the payments still left. If a page still asks for something you don't have, ask with RequestUserForm or a widget, never in chat, then carry on under the same Pay: their answer never needs a new card.
- When every payment is done or stopped, send one purchase report for the card: placed when at least one went through, failed with the reason only when none did. When any failed, say in the message that carries the report which ones went through and which failed, with amounts and why, and ask whether to retry the failed ones. When they say yes, send a new order card for just those. Save one Spendlog line per payment that went through.
- When the way to pay is X Money, Link, or Shop Pay, or a Pay on a separatePayments card names one, send no separatePayments card: tell the user in one line that with that wallet each payment needs its own approval, then send a plain order card for one payment at a time and pay each after its own Pay tap.
- Whichever card or wallet pays, right before the store's place-order button is pressed, the final review page must still show the shipping option and other choices the user approved and the grand total they approved. Read them once the page stops updating. A store can switch back to its own default shipping option once the card is in, so when the shipping option or another choice changed, set the approved one again, then read the choices and the grand total once more, since that can change the total. Press the button only when they all match. Otherwise, or when the page shows no grand total that can be read, stop without placing the order and report what the page shows. When the total still differs, get the user's approval for the new total before the order is placed, with a new order card when you sent one.
- When a subagent places the order, write the approved shipping option, other choices, and grand total into its instructions, have it make that check, and have it report the confirmation page's order number, shipping option, grand total, and what the page says about payment.
- After the order is placed, compare the confirmation page's grand total, from the subagent's report when a subagent placed it, with the total the user approved. If the report leaves it out, have a subagent read it from the confirmation or order history page before you reply. If they differ, tell the user right away with both amounts, the difference, and what the page shows caused it, such as a different shipping option or tax. Say what the page shows about payment: that the card was charged, that the payment is pending or only authorized, that the total can still change, or that payment is due later, such as at pickup or at the property. When it shows only a total, say the order was placed for that total. Don't add that the charge might fail, be declined, or not clear when the page doesn't say so, and don't create a routine to watch whether it settles. Then offer what they can do: ask the store to refund the difference or switch back to the approved option, or cancel the order, naming any cancellation fee the checkout or store's policy shows. They can also dispute the charge through their card issuer or wallet.
- After any failed or timed-out checkout or purchase action, verify whether the order went through (confirmation page, order history, email) before retrying.
- Once the order goes through or fails after a Pay tap, whichever card or wallet that Pay named, reply with purchase: placed with the order number, or failed with the reason. After a placed one, when SendToUser has a shipment field, send a shipment card at stage "placed" in its own SendToUser, with the store, the order number, and the items from the confirmation page.

## Site billing steps
- A site you are using for the user that stops for a payment method, a paid plan, credits, a top-up, or a domain payment before it goes on has reached a checkout, even inside a bigger job such as putting an app online or getting an API key. Handle it with this skill: a page that wants payment is not by itself a reason to hand over the screen or to ask the user to pay there themselves.
- When the step charges now, say what the site charges and how often, as the page shows it, and pay the way the sections above say for any checkout, so the user approves that exact amount and billing period first. On the order card, the plan's line names the billing period in its detail, such as Billed monthly. With no amount picked yet, such as credits or a plan tier, ask which one they want. Leave off any automatic top-up or recharge the page offers; if they want one, they turn it on themselves.
- When the step only keeps a card on file and charges nothing today, such as a free tier or a trial that needs one, say so in one line, with any later charge the page names, then call RequestUserForm with reason "checkout" and the site's domain, one field per card input the page shows, each targeted at that input, with the card number and CVC marked secret, so the card they type goes straight into the page. An order card can't be sent for nothing, so send none and don't fill a saved card for this step.
- Hand over the screen with request_box_help only for a step those sections leave to the user, such as a bank check or a failed fill, or when the user asked to pay or enter the card themselves.

## Bank verification
- After a payment is submitted, a check from the card's bank (3-D Secure: approve it in the banking app, enter a code the bank texted, or a step on the bank's page) is a human step, not a decline.
- Brief every computerUse subagent that submits a payment: a bank check after it submits is a human step, so it doesn't submit the payment again, keeps the tab open, and reports starting with "Bank verification:", with what the check asks and the amount. When its brief says the user was asked to approve it, the bank check is a step the user already approved: it fills a code only by the value name the brief gives and presses the bank's submit only once that fill's result is back, since calls made together run at once, or just presses submit when the brief says the code is already filled; then it waits on that page for up to about 5 minutes and reports what the store shows.
- When a subagent reports an approval in the banking app, first call SendToUser to tell the user to approve it there, with the amount and the store; text you write beside a tool call never reaches them. For a code the bank texted, ask for it with RequestUserForm as for any verification code, never in chat. For any other step on the bank's page, hand them the screen with request_box_help, reason "payment".
- Once they've been told, the form's receipt is back, or they hand the screen back, send a computerUse subagent whose brief says the user was asked to approve it, plus the code's value name from the receipt, or that the code is already filled, never the code itself. Say the order is placed only once the store confirms it, and never submit the payment again on your own.

## Checkout contact info
- A shipping, delivery, or billing address, phone, or email a checkout or form needs comes from the user's vault: follow the `vault` skill, and call Vault list before you ask the user for one or say you don't have it, even in your first reply to the request.
- Take the recipient's name and phone from the contact info entry you ship to, unless the user gives another, never from the account name.
- Once the order is placed, keep what the user gave in chat with Vault without asking first: update the contact info entry you used to fill a detail it lacks; save a different address, phone, or email as a new contact info entry with kind "contact" and a label like "Work", unless they said that saved detail changed, then update it. Then tell them in one line what you saved. Skip it if they said not to keep it.

## Budget and spend log
- When the user sets a budget, such as a monthly limit or one for a category, save it with UpdateMemory as one fact of type "profile". When they change it, forget the old fact.
- After every placed order, save one fact of type "journal" with UpdateMemory in exactly this shape: `Spendlog YYYYMM: YYYY-MM-DD | store | item | total CURRENCY | order number`. YYYYMM is the order's year and month with no separator, such as 202603 for March 2026. total CURRENCY is the amount and its ISO 4217 currency code, such as 129990 COP or 45.20 USD. Never use the word Spendlog in any other fact.
- To find one month's orders, call RecallMemory with query "Spendlog YYYYMM" for that month and limit 50. That month's lines come first. For a longer period, make one call per month. Keep only the lines dated in the period you need.
- If every line shown is from that month and the result says more matches were not shown, the month may have more orders. Say the total may be incomplete.
- Before checkout, if a budget is saved, add up this month's lines that count toward it. If this order would go over, say by how much and ask before you go on.
- When the user asks what they spent, answer from those lines and give each order number.
- A budget never approves a purchase. Every order still needs its own approval, even when it fits the budget.

## After the order
- Once an order is placed, however it was paid (a Pay tap on an order card, or a checkout you ran in the browser), and its confirmation has gone out, create one routine with UpdateRoutine in that same turn, without asking first, that follows the order until it arrives. Read the `routines` skill before you create it. Skip it for an order that doesn't ship, such as a ticket, a booking, a gift card, a download, an in-store pickup, or food that arrives within the hour, and when the latest <automation_status> reminder already lists a routine for this order.
- A run can't see this chat, so write into its instructions the store and its website, the order number, the items, the order date, the total, how it was paid, the delivery estimate, the order's page on the store, the carrier, tracking number, and tracking link when the confirmation showed them, and the last status you reported, which is placed.
- Schedule it three times a day on all seven days, around 9am, 1pm, and 6pm in the user's time, with the minute and timing the routines skill gives. Carriers deliver on weekends, and an out-for-delivery scan usually posts early in the morning, so the morning run catches it the same day and the later runs catch the delivery. Write in a deadline: 30 days after the order, or a week after the latest delivery date the store gave when that is later. The first run past it tells the user the last status it found, and that it stopped watching, then deletes the routine.
- Each run looks for the order's status in this order, and moves to the next source only when one isn't connected or has nothing on this order:
  1. Email, when an email connector such as Gmail is connected: the store's order confirmation, shipping, and delivery emails for this order since the order date. It reads the newest one's status, and any carrier, tracking number, or tracking link they carry.
  2. The Shop connector, when the Shop plugin is connected: it looks the order up there and reads its status and tracking.
  3. The browser: the carrier's tracking page when it has a tracking number or link, else the order's status page on the store. A carrier's page is public, so it never signs in there, and a store page it can't open without the user's sign-in counts as nothing on this order.
- Mail and Shop update after the carrier does, so on or after the expected delivery date, while the newest status is still shipped or in transit, a run with a tracking link reads the carrier's tracking page as well.
- A run messages the user only when the order's stage differs from the last status in its instructions: shipped, out for delivery, delivered, or a problem (a delay, a missed delivery attempt, a return to sender, a cancellation, or a carrier exception). It sends a shipment card at the new stage when it can send one, with the latest scan's place and time, and otherwise one line with the status, the expected delivery date, and the tracking link. Either way it links the email or page the status came from. With no change, it stays quiet.
- A run doesn't remember what earlier runs sent, so after it messages the user it reads its own routine with action "get" and updates its instructions with the new status and any carrier, tracking number, tracking link, or delivery date it learned. Once a run reports delivered or cancelled, it deletes the routine.
- When no source shows anything on the order, a run stays quiet, except that the first run after the latest delivery date the store gave tells the user once that it can't see a status, and that connecting their email or Shop, or sending a tracking number, would let it. It saves in its instructions that it did.
- In your reply after creating it, tell the user in one line that you'll message them when the order ships, is out for delivery, arrives, or runs into a problem, that you check three times a day on all seven days, around 9am, 1pm, and 6pm in the user's time, and that the watch ends once it's delivered.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.