Novu Design Workflow
novuhq/novu
Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.
Dodo Payments refunds and disputes, covering full and partial refunds, refund statuses, dispute and chargeback lifecycle events, evidence, and revoking or restoring customer access.
$ npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install hashgraph-online/awesome-codex-plugins refunds-and-disputes --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes .claude/skills/refunds-and-disputes && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "refunds-and-disputes" agent skill from https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes into .claude/skills/refunds-and-disputes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "refunds-and-disputes", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install hashgraph-online/awesome-codex-plugins refunds-and-disputes --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes .agents/skills/refunds-and-disputes && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "refunds-and-disputes" agent skill from https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes into .agents/skills/refunds-and-disputes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "refunds-and-disputes", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install hashgraph-online/awesome-codex-plugins refunds-and-disputes --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes .cursor/skills/refunds-and-disputes && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "refunds-and-disputes" agent skill from https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes into .cursor/skills/refunds-and-disputes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "refunds-and-disputes", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/hashgraph-online/awesome-codex-plugins.git --path plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install hashgraph-online/awesome-codex-plugins refunds-and-disputes --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes .gemini/skills/refunds-and-disputes && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "refunds-and-disputes" agent skill from https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes into .gemini/skills/refunds-and-disputes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "refunds-and-disputes", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install hashgraph-online/awesome-codex-plugins refunds-and-disputesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes .github/skills/refunds-and-disputes && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "refunds-and-disputes" agent skill from https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes into .github/skills/refunds-and-disputes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "refunds-and-disputes", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install hashgraph-online/awesome-codex-plugins refunds-and-disputes --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes .opencode/skills/refunds-and-disputes && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "refunds-and-disputes" agent skill from https://github.com/hashgraph-online/awesome-codex-plugins/tree/main/plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes into .opencode/skills/refunds-and-disputes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "refunds-and-disputes", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
refunds-and-disputesDodo Payments refunds and disputes, covering full and partial refunds, refund statuses, dispute and chargeback lifecycle events, evidence, and revoking or restoring customer access.
Refunds And Disputes is an agent skill from hashgraph-online/awesome-codex-plugins. Dodo Payments refunds and disputes, covering full and partial refunds, refund statuses, dispute and chargeback lifecycle events, evidence, and revoking or restoring customer access. Use when issuing a refund, handling refund or dispute webhooks, responding to a chargeback, or reconciling entitlements after a payment reversal.
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Webhooks. The repository describes itself as: A curated list of awesome OpenAI Codex / ChatGPT plugins, skills, and resources. The 1 Codex Marketplace. See live plugins at: https://hol.org/plugins/best-codex-plugins. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 3e1456a. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.dodopayments.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
DODO_PAYMENTS_API_KEYDODO_PAYMENTS_WEBHOOK_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Refunds And Disputes loads about 3.6k tokens when it runs. Until then it costs about 87 tokens; SKILL.md has 880 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from hashgraph-online/awesome-codex-plugins at commit 3e1456a, republished under its Apache-2.0 licence (© hashgraph-online). 880 words, ~3,648 tokens.
.claude/skills/refunds-and-disputes/SKILL.md (or your agent's skills folder).This skill covers issuing refunds (full and partial), handling the dispute lifecycle, and managing customer access during payment reversals. Disputes are inbound-only; Dodo handles the card-network process as Merchant of Record while you control application access and evidence gathering.
Refunds are initiated by you via the API. Each refund has a status that tells you whether the money has actually left your account. Partial refunds target specific line items in the original payment.
Disputes are initiated by the customer's card network. You cannot create them; you only list and retrieve them. The dispute lifecycle spans seven events, each requiring different application actions.
Amounts are always in the smallest currency unit (cents for USD, paise for INR, etc.).
Access revocation means removing the customer's ability to use the product or service. On a dispute, you typically revoke access while it's open. Restore it on dispute.won or dispute.cancelled (withdrawn, no further action needed); the losing outcomes (dispute.accepted, dispute.lost, dispute.expired) keep access revoked.
import DodoPayments from 'dodopayments';
const client = new DodoPayments({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: 'test_mode',
});
// Full refund
const refund = await client.refunds.create({
payment_id: 'pay_abc123',
});
console.log(refund.refund_id);
console.log(refund.status); // 'pending', 'succeeded', 'review', or 'failed'To refund only specific items from a payment, pass the items array with each item ID and the amount to refund in the smallest currency unit. Omit amount to refund the whole item:
const partialRefund = await client.refunds.create({
payment_id: 'pay_abc123',
items: [
{ item_id: 'item_1' }, // no amount: the whole item is refunded
{ item_id: 'item_2', amount: 2500 },
],
});Each refund has one of four statuses:
| Status | Meaning | Your action |
|---|---|---|
pending | Refund is processing; money hasn't left your account yet | Wait for a webhook or poll the refund status |
succeeded | Money has been returned to the customer | Revoke access if the product is non-refundable; update your records |
review | Refund is under review (rare) | Contact support; do not assume it will succeed |
failed | Refund failed; money remains in your account | Investigate the failure; consider retrying or contacting the customer |
// List all refunds
const refunds = await client.refunds.list();
// Retrieve a specific refund
const refund = await client.refunds.retrieve('ref_xyz789');
console.log(refund.status);Webhook signature verification is covered in the webhook-integration skill. Always verify the signature before processing.
import DodoPayments from 'dodopayments';
import express from 'express';
const app = express();
app.use(express.raw({ type: 'application/json' }));
// `environment` is a narrow union, but env vars are `string | undefined`.
// Narrow explicitly rather than casting, and default to test mode so a missing
// variable can never accidentally hit live.
const environment = process.env.DODO_PAYMENTS_ENVIRONMENT === 'live_mode' ? 'live_mode' : 'test_mode';
const client = new DodoPayments({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment,
webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
});
type WebhookEvent = ReturnType<typeof client.webhooks.unwrap>;
// Register ONE endpoint for every Dodo event. A second app.post('/webhook')
// would never run, because the first handler answers every request.
app.post('/webhook', async (req, res) => {
let event: WebhookEvent;
try {
event = client.webhooks.unwrap(req.body.toString(), {
headers: {
'webhook-id': req.headers['webhook-id'] as string,
'webhook-signature': req.headers['webhook-signature'] as string,
'webhook-timestamp': req.headers['webhook-timestamp'] as string,
},
});
} catch {
// Only signature verification failures reach this branch
res.status(401).json({ error: 'Invalid signature' });
return;
}
try {
await handleRefundEvent(event);
await handleDisputeEvent(event); // defined under "Handle dispute webhooks"
res.json({ received: true });
} catch (error) {
// Any non-2xx response makes Dodo retry the delivery
console.error('Webhook handler failed:', error);
res.status(500).json({ error: 'Webhook handler failed' });
}
});
async function handleRefundEvent(event: WebhookEvent) {
if (event.type === 'refund.succeeded') {
const refund = event.data;
if (!refund.is_partial) {
// Full refund: nothing in the payment is still paid for
await revokeCustomerAccess(refund.customer.customer_id);
} else {
// Partial refund: keep access to items that are still paid for, and
// remove it for any item with nothing left to refund. Reading the line
// items covers every case - an omitted amount, an explicit amount equal
// to the item price, or several partial refunds that add up to it.
const { items } = await client.payments.retrieveLineItems(refund.payment_id);
const fullyRefundedItemIds = items
.filter((item) => item.refundable_amount === 0)
.map((item) => item.items_id);
await revokeItemAccess(refund.customer.customer_id, fullyRefundedItemIds);
}
await updateRefundRecord(refund.refund_id, 'succeeded');
}
if (event.type === 'refund.failed') {
const refund = event.data;
// Refund failed; keep access active, alert support
await logRefundFailure(refund.refund_id, refund.reason);
}
}Disputes are inbound-only. You cannot create them; you can only list and retrieve them.
// List all disputes
const disputes = await client.disputes.list();
// Retrieve a specific dispute
const dispute = await client.disputes.retrieve('dis_abc123');
console.log(dispute.dispute_status);
console.log(dispute.amount); // in smallest currency unitA dispute moves through seven events. Each event requires a different action from your application:
| Event | Meaning | Your action |
|---|---|---|
dispute.opened | Customer initiated a chargeback | Record the dispute; consider revoking access immediately; gather evidence from your logs |
dispute.challenged | You submitted evidence | Wait for the card network to review |
dispute.accepted | You accepted (conceded) the dispute; funds go to the cardholder | Keep access revoked; mark the dispute as accepted in your records |
dispute.cancelled | The dispute was withdrawn or cancelled | No further action needed; restore access you revoked on dispute.opened |
dispute.expired | Dispute window closed without resolution | Treat as lost; keep access revoked |
dispute.won | You won the dispute | Funds are retained; restore access; update customer records |
dispute.lost | You lost the dispute | Funds returned to cardholder; keep access revoked; reconcile your records |
Webhook dispute payloads intentionally contain no customer field. Resolve the customer with an extra disputes.retrieve() call: the webhook's dispute_id identifies the dispute, and the returned GetDispute includes customer. Without this lookup, access-control handlers would receive undefined.
async function resolveDisputeCustomerId(disputeId: string) {
const dispute = await client.disputes.retrieve(disputeId);
return dispute.customer.customer_id;
}
// Called from the single /webhook handler above, after signature verification
async function handleDisputeEvent(event: WebhookEvent) {
if (event.type === 'dispute.opened') {
const dispute = event.data;
// Record the dispute and revoke access
await recordDispute(dispute.dispute_id, dispute.payment_id, dispute.amount);
const customerId = await resolveDisputeCustomerId(dispute.dispute_id);
await revokeCustomerAccess(customerId);
// Gather evidence from your system and submit via dashboard
// (no evidence-submission API exists; use the Dodo dashboard)
}
if (event.type === 'dispute.won') {
const dispute = event.data;
// Funds retained; restore normal state
await markDisputeResolved(dispute.dispute_id, 'won');
const customerId = await resolveDisputeCustomerId(dispute.dispute_id);
await restoreCustomerAccess(customerId);
}
if (event.type === 'dispute.lost') {
const dispute = event.data;
// Funds returned to cardholder; keep access revoked
await markDisputeResolved(dispute.dispute_id, 'lost');
// Do NOT restore access
}
if (event.type === 'dispute.accepted') {
const dispute = event.data;
// Merchant conceded; funds go to the cardholder and access stays revoked
await markDisputeResolved(dispute.dispute_id, 'accepted');
// Do NOT restore access
}
if (event.type === 'dispute.cancelled') {
const dispute = event.data;
// The dispute was withdrawn; no further action is needed, so undo the
// revocation from dispute.opened
await markDisputeResolved(dispute.dispute_id, 'cancelled');
const customerId = await resolveDisputeCustomerId(dispute.dispute_id);
await restoreCustomerAccess(customerId);
}
}Dodo handles the card-network dispute process as Merchant of Record. You submit evidence through the Dodo dashboard, not via API. No evidence-submission API exists.
When a dispute opens, gather your evidence (order confirmation, delivery proof, customer communication, etc.) and upload it to the dashboard within the dispute window (10 days from when the dispute is created). The card network reviews your evidence and makes a final decision.
A common pattern for managing access during disputes:
async function handleDisputeLifecycle(
dispute: Awaited<ReturnType<typeof client.disputes.retrieve>>,
) {
const customerId = dispute.customer.customer_id;
switch (dispute.dispute_status) {
case 'dispute_opened':
// Revoke access immediately
await revokeCustomerAccess(customerId);
break;
case 'dispute_won':
// You won; restore access
await restoreCustomerAccess(customerId);
break;
case 'dispute_lost':
// You lost; keep access revoked
// (do nothing)
break;
case 'dispute_accepted':
// You conceded; funds go to the cardholder and access stays revoked
break;
case 'dispute_cancelled':
// Withdrawn; no further action needed, so restore access
await restoreCustomerAccess(customerId);
break;
case 'dispute_expired':
// Treat as lost; keep access revoked
break;
case 'dispute_challenged':
// Evidence is under review; keep access revoked
break;
}
}When a refund succeeds, you must reconcile the customer's access. If the product is non-refundable (e.g., a digital download or subscription already used), revoke access. If it's refundable (e.g., a subscription not yet started), you may restore access or leave it revoked depending on your policy.
async function reconcileRefund(refund) {
if (refund.status !== 'succeeded') {
return; // Not yet final
}
const payment = await client.payments.retrieve(refund.payment_id);
const customer = payment.customer;
// Revoke access for non-refundable products
const includesNonRefundableProduct = payment.product_cart?.some(({ product_id }) =>
isNonRefundable(product_id),
);
if (includesNonRefundableProduct) {
await revokeCustomerAccess(customer.customer_id);
}
// Update your entitlement records
await updateEntitlementRecord(customer.customer_id, {
refund_id: refund.refund_id,
refund_amount: refund.amount,
refund_date: new Date(),
});
}Auto-refunding without revoking access. A refund webhook means money is leaving your account. If the product is non-refundable, revoke access immediately. Don't wait for the customer to ask.
Treating dispute.opened as final. A dispute is not lost until the card network says so. Keep access revoked while it's open, but don't delete customer data or close their account.
Ignoring partial refunds when computing entitlements. If a customer refunds only one item from a multi-item purchase, their entitlement to the other items remains valid. Track refunds by item, not just by payment.
Restoring access on a losing outcome. dispute.accepted, dispute.lost, and dispute.expired resolve (or typically resolve) in the cardholder's favor; keep access revoked. Restore access only on dispute.won or dispute.cancelled (the dispute was withdrawn and needs no further action).
Submitting evidence after the dispute window closes. You have 10 days from when the dispute is created to respond. Set a calendar reminder and gather evidence immediately when a dispute opens.
Assuming Dodo will handle access revocation. Dodo handles the card-network process; you handle application access. Dodo won't revoke your customer's subscription or file access automatically.
webhook-integration skill for signature verification© hashgraph-online, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes of hashgraph-online/awesome-codex-plugins.
Open the folder on GitHubat commit 3e1456a
Refunds And Disputes next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Refunds And Disputes this skillhashgraph-online/awesome-codex-plugins | 1.3k | — | ~3.6k | Automated safety check: Pass | Apache-2.0 | |
| Novu Design Workflownovuhq/novu | 40k | — | ~2.6k | Automated safety check: Pass | Custom licence | |
| Golivemikehasa/golive-skill | 1.3k | — | ~13k | Automated safety check: Notes | MIT | |
| Stripe Appsfossasia/eventyay | 1.7k | 1 repos | ~3.6k | Automated safety check: Pass | Apache-2.0 | |
| Dingtalk Messageagentscope-ai/ReMe | 3.6k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| PR Review Provideryansongda/pay | 5.4k | — | ~2.4k | Automated safety check: Pass | MIT |
novuhq/novu
Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.
mikehasa/golive-skill
Take an agent-written app from repo to live production on the user's OWN accounts, with providers they choose (hosting, database, auth, payments, email, domain/DNS).
fossasia/eventyay
A skill your agent uses when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g.
agentscope-ai/ReMe
钉钉消息发送技能。支持企业内部机器人(批量单聊/群聊)和 Webhook 自定义机器人两种接入方式,支持多机器人管理,支持文本、Markdown、链接、ActionCard、FeedCard等多种消息类型。
yansongda/pay
A skill your agent uses when reviewing PRs that add or modify a payment Provider in yansongda/pay - covers plugin pipeline, multi-tenant safety, signature verification, docs, and naming conventions.
kanchengw/cnllm
Guides Stripe integration decisions — API selection (Checkout Sessions vs PaymentIntents), Connect platform setup (Accounts v2, controller properties), billing/subscriptions, Treasury financial…
hashgraph-online/awesome-codex-plugins
Create original anime-style reaction stickers as looping GIFs and MP4 previews, using generated character pose sheets and timed key poses.
hashgraph-online/awesome-codex-plugins
Manage and query Calibre libraries with the calibredb CLI (local paths or Calibre Content server URLs).
hashgraph-online/awesome-codex-plugins
A skill your agent uses when adding, changing, testing, or debugging Rust HTTP APIs and services, especially when Codex needs black-box integration tests, random-port app startup, real database test…
hashgraph-online/awesome-codex-plugins
Make a studio's game look like something at build time — a cover from a real frame of the game (free), painted covers, backdrops, textures and character plates from image models through the…
hashgraph-online/awesome-codex-plugins
Use CALL-E from Codex through the calle CLI. An agent skill from hashgraph-online/awesome-codex-plugins.
hashgraph-online/awesome-codex-plugins
Balance game difficulty, resources, rewards, probability, progression, economies, and dominant strategies.
Categories
Dodo Payments refunds and disputes, covering full and partial refunds, refund statuses, dispute and chargeback lifecycle events, evidence, and revoking or restoring customer access. Refunds And Disputes is an agent skill from hashgraph-online/awesome-codex-plugins. Dodo Payments refunds and disputes, covering full and partial refunds, refund statuses, dispute and chargeback lifecycle events, evidence, and revoking or restoring customer access.
Refunds And Disputes fits situations like: issuing a refund; handling refund; dispute webhooks; responding to a chargeback.
Run `npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a claude-code`. Or copy the skill folder (plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes in hashgraph-online/awesome-codex-plugins) into .claude/skills/refunds-and-disputes in your project. Claude Code loads it when a task matches its description.
Run `npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a codex`. Or copy the skill folder (plugins/dodopayments/dodo-agent-plugin/skills/refunds-and-disputes in hashgraph-online/awesome-codex-plugins) into .agents/skills/refunds-and-disputes in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add hashgraph-online/awesome-codex-plugins --skill refunds-and-disputes -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/refunds-and-disputes, .gemini/skills/refunds-and-disputes, .github/skills/refunds-and-disputes and .opencode/skills/refunds-and-disputes in your project.
Going by SKILL.md and its folder, Refunds And Disputes needs credentials named DODO_PAYMENTS_API_KEY and DODO_PAYMENTS_WEBHOOK_KEY. Our summary lists: A credential in DODO_PAYMENTS_API_KEY; A credential in DODO_PAYMENTS_WEBHOOK_KEY.
SKILL.md names 1 domain. As links in the text: docs.dodopayments.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Refunds And Disputes is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Refunds And Disputes: Novu Design Workflow (novuhq/novu, 40k stars), Golive (mikehasa/golive-skill, 1.3k stars), Stripe Apps (fossasia/eventyay, 1.7k stars) and Dingtalk Message (agentscope-ai/ReMe, 3.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
hashgraph-online (a GitHub organization) maintains it in hashgraph-online/awesome-codex-plugins, which has 1,267 GitHub stars. The repository holds 716 skills in this directory. The repository was last updated on October 10, 2026.
Source: hashgraph-online/awesome-codex-plugins on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.