Install
$ agentstack add skill-40rty-ai-shopify-admin-skills-shopify-admin-customer-timeline-export ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Purpose
Produces a complete, chronological dossier for a single customer. Pulls the customer record (identity, marketing consent, lifetime totals, tags, notes, addresses) and every order they've placed (with line items, fulfillments, refunds, and returns) and emits one merged CSV plus a human-readable timeline. Used by support agents handling escalations, by data export requests, and as the source-of-truth dump before an account merge or deletion. Read-only — no mutations.
Prerequisites
- Authenticated Shopify CLI session:
shopify store auth --store --scopes read_customers,read_orders - API scopes:
read_customers,read_orders
Parameters
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | store | string | yes | — | Store domain (e.g., mystore.myshopify.com) | | format | string | no | human | Output format: human or json | | customerid | string | yes | — | GID of the customer (e.g., gid://shopify/Customer/12345) | | includelineitems | bool | no | true | Include per-line-item rows in the CSV (one row per line item) | | includerefunds | bool | no | true | Include refunds and returns as separate rows in the timeline | | max_orders | integer | no | 250 | Cap on orders fetched (most recent first); 0 = no cap |
Safety
> ℹ️ Read-only skill — no mutations are executed. Safe to run at any time. Output contains personally identifiable information — handle the resulting CSV with the same care as any customer export and delete it once the support case is closed.
Workflow Steps
- OPERATION:
customer— query
Inputs: id: , select identity fields, lifetime aggregates, tags, note, marketing consent, addresses, createdAt Expected output: Customer header record; abort with a clear error if null
- OPERATION:
orders— query
Inputs: query: "customer_id:", first: 250, sortKey: CREATED_AT, reverse: true, select id, name, createdAt, processedAt, displayFinancialStatus, displayFulfillmentStatus, totalPriceSet, totalShippingPriceSet, totalDiscountsSet, lineItems(first: 50) { node { id title quantity sku discountedTotalSet variant { sku } } }, fulfillments { id status deliveredAt trackingInfo { number url } }, refunds { id createdAt totalRefundedSet refundLineItems(first: 50) { node { lineItem { id title } quantity subtotalSet } } }, pagination cursor (stop at max_orders if set) Expected output: Full chronological order list with embedded refunds and fulfillments
- Build the merged timeline events: customer creation → each order → each refund/return per order. Sort all events by datetime ascending for the human-readable summary; the CSV is also sorted ascending.
GraphQL Operations
# customer:query — validated against api_version 2025-01
query CustomerHeaderForTimeline($id: ID!) {
customer(id: $id) {
id
displayName
firstName
lastName
defaultEmailAddress { emailAddress }
phone
note
tags
numberOfOrders
amountSpent { amount currencyCode }
emailMarketingConsent { marketingState marketingOptInLevel consentUpdatedAt }
smsMarketingConsent { marketingState marketingOptInLevel consentUpdatedAt }
addresses(first: 25) {
id firstName lastName address1 address2 city provinceCode countryCodeV2 zip phone
}
defaultAddress { id }
createdAt
updatedAt
}
}
# orders:query — validated against api_version 2025-01
query CustomerOrdersForTimeline($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query, sortKey: CREATED_AT, reverse: true) {
edges {
node {
id
name
createdAt
processedAt
displayFinancialStatus
displayFulfillmentStatus
cancelledAt
cancelReason
totalPriceSet { shopMoney { amount currencyCode } }
totalShippingPriceSet { shopMoney { amount currencyCode } }
totalDiscountsSet { shopMoney { amount currencyCode } }
lineItems(first: 50) {
edges { node {
id title quantity sku
discountedTotalSet { shopMoney { amount currencyCode } }
variant { id sku }
} }
}
fulfillments {
id status deliveredAt
trackingInfo { number url company }
}
refunds {
id
createdAt
totalRefundedSet { shopMoney { amount currencyCode } }
refundLineItems(first: 50) {
edges { node {
quantity
lineItem { id title }
subtotalSet { shopMoney { amount currencyCode } }
} }
}
}
}
}
pageInfo { hasNextPage endCursor }
}
}
Session Tracking
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Customer Timeline Export ║
║ Store: ║
║ Started: ║
╚══════════════════════════════════════════════╝
After each step, emit:
[N/TOTAL]
→ Params:
→ Result:
On completion, emit:
For format: human (default):
══════════════════════════════════════════════
CUSTOMER TIMELINE
Customer: () ID:
Joined:
Lifetime spend: $ Total orders: Refunds total: $
Tags:
Email consent: (since ) SMS consent: (since )
Recent timeline (most recent first):
ORDER $ /
REFUND $
RETURN items:
...
Output: customer_timeline__.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "customer-timeline-export",
"store": "",
"customer_id": "",
"header": {
"name": "", "email": "", "phone": "",
"joined": "", "lifetime_spend": 0, "currency": "USD",
"total_orders": 0, "tags": [],
"email_consent": "", "sms_consent": ""
},
"totals": { "orders": 0, "refunds_count": 0, "refunds_amount": 0 },
"output_file": "customer_timeline__.csv"
}
Output Format
CSV file customer_timeline__.csv with columns: event_datetime, event_type, event_id, order_name, line_item_title, sku, quantity, amount, currency, financial_status, fulfillment_status, tracking_number, notes
Event types include: customer_created, order_placed, order_fulfilled, order_delivered, order_cancelled, refund_issued, return_initiated.
Error Handling
| Error | Cause | Recovery | |-------|-------|----------| | THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times | | Customer not found | Wrong GID | Use order-lookup-and-summary to find a recent order, then read customer.id | | 0 orders | New account or guest-only | Emit header-only timeline | | Order anonymized | GDPR data wipe | Skip line items; emit placeholder row | | Pagination beyond max_orders | Cap reached | Stop, set truncated: true |
Best Practices
- Run before any merge, deletion, or escalation — pre-state is unreconstructable once a merge commits.
- For high-volume customers set
max_orders: 50; full lifetime is rarely needed for one support case. - CSV is event-sorted so downstream pivoting works without reshaping.
- Pair with
customer-merge: run on both winner and loser before merging for a permanent pre-merge record.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: 40RTY-ai
- Source: 40RTY-ai/shopify-admin-skills
- License: MIT
- Homepage: http://skills.40rty.ai
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.