{"id":"0404d68e-2631-4c32-9719-a02b6151a59e","shortId":"zGFukT","kind":"skill","title":"inngest-events","tagline":"Use when designing event-driven workflows, decoupling services, implementing fan-out patterns (one trigger, many downstream handlers), implementing idempotent event handling with IDs (24-hour dedupe window), or handling at-least-once delivery from external sources like Stripe web","description":"# Inngest Events\n\nMaster Inngest event design and delivery patterns. Events are the foundation of Inngest - learn to design robust event schemas, implement idempotency, leverage fan-out patterns, and handle system events effectively.\n\n> **These skills are focused on TypeScript.** For Python or Go, refer to the [Inngest documentation](https://www.inngest.com/llms.txt) for language-specific guidance. Core concepts apply across all languages.\n\n## Event Payload Format\n\nEvery Inngest event is a JSON object with required and optional properties:\n\n### Required Properties\n\n```typescript\ntype Event = {\n  name: string; // Event type (triggers functions)\n  data: object; // Payload data (any nested JSON)\n};\n```\n\n### Complete Schema\n\n```typescript\ntype EventPayload = {\n  name: string; // Required: event type\n  data: Record<string, any>; // Required: event data\n  id?: string; // Optional: deduplication ID\n  ts?: number; // Optional: timestamp (Unix ms)\n  v?: string; // Optional: schema version\n};\n```\n\n### Basic Event Example\n\n```typescript\nawait inngest.send({\n  name: \"billing/invoice.paid\",\n  data: {\n    customerId: \"cus_NffrFeUfNV2Hib\",\n    invoiceId: \"in_1J5g2n2eZvKYlo2C0Z1Z2Z3Z\",\n    userId: \"user_03028hf09j2d02\",\n    amount: 1000,\n    metadata: {\n      accountId: \"acct_1J5g2n2eZvKYlo2C0Z1Z2Z3Z\",\n      accountName: \"Acme.ai\"\n    }\n  }\n});\n```\n\n## Event Naming Conventions\n\n**Use the Object-Action pattern:** `domain/noun.verb`\n\n### Recommended Patterns\n\n```typescript\n// ✅ Good: Clear object-action pattern\n\"billing/invoice.paid\";\n\"user/profile.updated\";\n\"order/item.shipped\";\n\"ai/summary.completed\";\n\n// ✅ Good: Domain prefixes for organization\n\"stripe/customer.created\";\n\"intercom/conversation.assigned\";\n\"slack/message.posted\";\n\n// ❌ Avoid: Unclear or inconsistent\n\"payment\"; // What happened?\n\"user_update\"; // Use dots, not underscores\n\"invoiceWasPaid\"; // Too verbose\n```\n\n### Naming Guidelines\n\n- **Past tense:** Events describe what happened (`created`, `updated`, `failed`)\n- **Dot notation:** Use dots for hierarchy (`billing/invoice.paid`)\n- **Prefixes:** Group related events (`api/user.created`, `webhook/stripe.received`)\n- **Consistency:** Establish patterns and stick to them\n\n## Event IDs and Idempotency\n\n**When to use IDs:** Prevent duplicate processing when events might be sent multiple times.\n\n### Basic Deduplication\n\n```typescript\nawait inngest.send({\n  id: \"cart-checkout-completed-ed12c8bde\", // Unique per event type\n  name: \"storefront/cart.checkout.completed\",\n  data: {\n    cartId: \"ed12c8bde\",\n    items: [\"item1\", \"item2\"]\n  }\n});\n```\n\n### ID Best Practices\n\n```typescript\n// ✅ Good: Specific to event type and instance\nid: `invoice-paid-${invoiceId}`;\nid: `user-signup-${userId}-${timestamp}`;\nid: `order-shipped-${orderId}-${trackingNumber}`;\n\n// ❌ Bad: Generic IDs shared across event types\nid: invoiceId; // Could conflict with other events\nid: \"user-action\"; // Too generic\nid: customerId; // Same customer, different events\n```\n\n**Deduplication window:** 24 hours from first event reception\n\nSee **inngest-durable-functions** for idempotency configuration.\n\n## The `ts` Parameter for Delayed Delivery\n\n**When to use:** Schedule events for future processing or maintain event ordering.\n\n### Future Scheduling\n\n```typescript\nconst oneHourFromNow = Date.now() + 60 * 60 * 1000;\n\nawait inngest.send({\n  name: \"trial/reminder.send\",\n  ts: oneHourFromNow, // Deliver in 1 hour\n  data: {\n    userId: \"user_123\",\n    trialExpiresAt: \"2024-02-15T12:00:00Z\"\n  }\n});\n```\n\n### Maintaining Event Order\n\n```typescript\n// Events with timestamps are processed in chronological order\nconst events = [\n  {\n    name: \"user/action.performed\",\n    ts: 1640995200000, // Earlier\n    data: { action: \"login\" }\n  },\n  {\n    name: \"user/action.performed\",\n    ts: 1640995260000, // Later\n    data: { action: \"purchase\" }\n  }\n];\n\nawait inngest.send(events);\n```\n\n## Fan-Out Patterns\n\n**Use case:** One event triggers multiple independent functions for reliability and parallel processing.\n\n### Basic Fan-Out Implementation\n\n```typescript\n// Send single event\nawait inngest.send({\n  name: \"user/signup.completed\",\n  data: {\n    userId: \"user_123\",\n    email: \"user@example.com\",\n    plan: \"pro\"\n  }\n});\n\n// Multiple functions respond to same event\nconst sendWelcomeEmail = inngest.createFunction(\n  { id: \"send-welcome-email\", triggers: [{ event: \"user/signup.completed\" }] },\n  async ({ event, step }) => {\n    await step.run(\"send-email\", async () => {\n      return sendEmail({\n        to: event.data.email,\n        template: \"welcome\"\n      });\n    });\n  }\n);\n\nconst createTrialSubscription = inngest.createFunction(\n  { id: \"create-trial\", triggers: [{ event: \"user/signup.completed\" }] },\n  async ({ event, step }) => {\n    await step.run(\"create-subscription\", async () => {\n      return stripe.subscriptions.create({\n        customer: event.data.stripeCustomerId,\n        trial_period_days: 14\n      });\n    });\n  }\n);\n\nconst addToCrm = inngest.createFunction(\n  { id: \"add-to-crm\", triggers: [{ event: \"user/signup.completed\" }] },\n  async ({ event, step }) => {\n    await step.run(\"crm-sync\", async () => {\n      return crm.contacts.create({\n        email: event.data.email,\n        plan: event.data.plan\n      });\n    });\n  }\n);\n```\n\n### Fan-Out Benefits\n\n- **Independence:** Functions run separately; one failure doesn't affect others\n- **Parallel execution:** All functions run simultaneously\n- **Selective replay:** Re-run only failed functions\n- **Cross-service:** Trigger functions in different codebases/languages\n\n### Advanced Fan-Out with `waitForEvent`\n\nIn expressions, `event` = the **original** triggering event, `async` = the **new** event being matched. See [Expression Syntax Reference](../references/expressions.md) for full details.\n\n```typescript\nconst orchestrateOnboarding = inngest.createFunction(\n  { id: \"orchestrate-onboarding\", triggers: [{ event: \"user/signup.completed\" }] },\n  async ({ event, step }) => {\n    // Fan out to multiple services\n    await step.sendEvent(\"fan-out\", [\n      { name: \"email/welcome.send\", data: event.data },\n      { name: \"subscription/trial.create\", data: event.data },\n      { name: \"crm/contact.add\", data: event.data }\n    ]);\n\n    // Wait for all to complete\n    const [emailResult, subResult, crmResult] = await Promise.all([\n      step.waitForEvent(\"email-sent\", {\n        event: \"email/welcome.sent\",\n        timeout: \"5m\",\n        if: `event.data.userId == async.data.userId`\n      }),\n      step.waitForEvent(\"subscription-created\", {\n        event: \"subscription/trial.created\",\n        timeout: \"5m\",\n        if: `event.data.userId == async.data.userId`\n      }),\n      step.waitForEvent(\"crm-synced\", {\n        event: \"crm/contact.added\",\n        timeout: \"5m\",\n        if: `event.data.userId == async.data.userId`\n      })\n    ]);\n\n    // Complete onboarding\n    await step.run(\"complete-onboarding\", async () => {\n      return completeUserOnboarding(event.data.userId);\n    });\n  }\n);\n```\n\nSee **inngest-steps** for additional patterns including `step.invoke`.\n\n## System Events\n\nInngest emits system events for function lifecycle monitoring:\n\n### Available System Events\n\n```typescript\n// Function execution events\n\"inngest/function.failed\"; // Function failed after retries\n\"inngest/function.finished\"; // Function finished - completed or failed\n\"inngest/function.cancelled\"; // Function cancelled before completion\n```\n\n### Handling Failed Functions\n\n```typescript\nconst handleFailures = inngest.createFunction(\n  { id: \"handle-failed-functions\", triggers: [{ event: \"inngest/function.failed\" }] },\n  async ({ event, step }) => {\n    const { function_id, run_id, error } = event.data;\n\n    await step.run(\"log-failure\", async () => {\n      logger.error(\"Function failed\", {\n        functionId: function_id,\n        runId: run_id,\n        error: error.message,\n        stack: error.stack\n      });\n    });\n\n    // Alert on critical function failures\n    if (function_id.includes(\"critical\")) {\n      await step.run(\"send-alert\", async () => {\n        return alerting.sendAlert({\n          title: `Critical function failed: ${function_id}`,\n          severity: \"high\",\n          runId: run_id\n        });\n      });\n    }\n\n    // Auto-retry certain failures\n    if (error.code === \"RATE_LIMIT_EXCEEDED\") {\n      await step.run(\"schedule-retry\", async () => {\n        return inngest.send({\n          name: \"retry/function.requested\",\n          ts: Date.now() + 5 * 60 * 1000, // Retry in 5 minutes\n          data: { originalRunId: run_id }\n        });\n      });\n    }\n  }\n);\n```\n\n## Sending Events\n\n### Client Setup\n\n```typescript\n// inngest/client.ts\nimport { Inngest } from \"inngest\";\n\nexport const inngest = new Inngest({\n  id: \"my-app\"\n});\n// You must set INNGEST_EVENT_KEY environment variable in production\n```\n\n### Single Event\n\n```typescript\nconst result = await inngest.send({\n  name: \"order/placed\",\n  data: {\n    orderId: \"ord_123\",\n    customerId: \"cus_456\",\n    amount: 2500,\n    items: [\n      { id: \"item_1\", quantity: 2 },\n      { id: \"item_2\", quantity: 1 }\n    ]\n  }\n});\n\n// Returns event IDs for tracking\nconsole.log(result.ids); // [\"01HQ8PTAESBZPBDS8JTRZZYY3S\"]\n```\n\n### Batch Events\n\n```typescript\nconst orderItems = await getOrderItems(orderId);\n\n// Convert to events\nconst events = orderItems.map((item) => ({\n  name: \"inventory/item.reserved\",\n  data: {\n    itemId: item.id,\n    orderId: orderId,\n    quantity: item.quantity,\n    warehouseId: item.warehouseId\n  }\n}));\n\n// Send all at once (up to 512kb)\nawait inngest.send(events);\n```\n\n### Sending from Functions\n\n```typescript\ninngest.createFunction(\n  { id: \"process-order\", triggers: [{ event: \"order/placed\" }] },\n  async ({ event, step }) => {\n    // Use step.sendEvent() instead of inngest.send() in functions\n    // for reliability and deduplication\n    await step.sendEvent(\"trigger-fulfillment\", {\n      name: \"fulfillment/order.received\",\n      data: {\n        orderId: event.data.orderId,\n        priority: event.data.customerTier === \"premium\" ? \"high\" : \"normal\"\n      }\n    });\n  }\n);\n```\n\n## Event Design Best Practices\n\n### Schema Versioning\n\n```typescript\n// Use version field to track schema changes\nawait inngest.send({\n  name: \"user/profile.updated\",\n  v: \"2024-01-15.1\", // Schema version\n  data: {\n    userId: \"user_123\",\n    changes: {\n      email: \"new@example.com\",\n      preferences: { theme: \"dark\" }\n    },\n    // New field in v2 schema\n    auditInfo: {\n      changedBy: \"user_456\",\n      reason: \"user_requested\"\n    }\n  }\n});\n```\n\n### Rich Context Data\n\n```typescript\n// Include enough context for all consumers\nawait inngest.send({\n  name: \"payment/charge.succeeded\",\n  data: {\n    // Primary identifiers\n    chargeId: \"ch_123\",\n    customerId: \"cus_456\",\n\n    // Amount details\n    amount: 2500,\n    currency: \"usd\",\n\n    // Context for different consumers\n    subscription: {\n      id: \"sub_789\",\n      plan: \"pro_monthly\"\n    },\n    invoice: {\n      id: \"inv_012\",\n      number: \"INV-2024-001\"\n    },\n\n    // Metadata for debugging\n    paymentMethod: {\n      type: \"card\",\n      last4: \"4242\",\n      brand: \"visa\"\n    },\n    metadata: {\n      source: \"stripe_webhook\",\n      environment: \"production\"\n    }\n  }\n});\n```\n\n**Event design principles:**\n\n1. **Self-contained:** Include all data consumers need\n2. **Immutable:** Never modify event schemas after sending\n3. **Traceable:** Include correlation IDs and audit trails\n4. **Actionable:** Provide enough context for business logic\n5. **Debuggable:** Include metadata for troubleshooting","tags":["inngest","events","skills","agent-skill-repository","agent-skills","agentic-skills","ai-agents","claude-code-skills","cursor-skills","openclaw-skills"],"capabilities":["skill","source-inngest","skill-inngest-events","topic-agent-skill-repository","topic-agent-skills","topic-agentic-skills","topic-ai-agents","topic-claude-code-skills","topic-cursor-skills","topic-openclaw-skills"],"categories":["inngest-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/inngest/inngest-skills/inngest-events","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add inngest/inngest-skills","source_repo":"https://github.com/inngest/inngest-skills","install_from":"skills.sh"}},"qualityScore":"0.461","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 22 github stars · SKILL.md body (11,551 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:05:31.189Z","embedding":null,"createdAt":"2026-04-18T23:06:56.690Z","updatedAt":"2026-05-18T19:05:31.189Z","lastSeenAt":"2026-05-18T19:05:31.189Z","tsv":"'-001':1129 '-01':1056 '-02':432 '-15':433 '-15.1':1057 '-2024':1128 '/llms.txt)':96 '/references/expressions.md':652 '00':435 '00z':436 '012':1125 '01hq8ptaesbzpbds8jtrzzyy3s':958 '03028hf09j2d02':191 '1':424,943,950,1149 '1000':193,415,884 '123':429,503,934,1063,1101 '14':566 '1640995200000':454 '1640995260000':462 '1j5g2n2ezvkylo2c0z1z2z3z':188,197 '2':945,948,1158 '2024':431,1055 '24':29,375 '2500':939,1108 '3':1166 '4':1174 '4242':1137 '456':937,1078,1104 '5':882,887,1182 '512kb':991 '5m':710,721,732 '60':413,414,883 '789':1118 'accountid':195 'accountnam':198 'acct':196 'acme.ai':199 'across':105,351 'action':207,217,364,457,465,1175 'add':572 'add-to-crm':571 'addit':752 'addtocrm':568 'advanc':629 'affect':605 'ai/summary.completed':222 'alert':833,845 'alerting.sendalert':848 'amount':192,938,1105,1107 'api/user.created':269 'app':911 'appli':104 'async':525,533,550,558,578,586,642,667,743,804,819,846,875,1007 'async.data.userid':713,724,735 'at-least-onc':35 'audit':1172 'auditinfo':1075 'auto':861 'auto-retri':860 'avail':766 'avoid':231 'await':178,299,416,467,496,528,553,581,675,701,738,814,841,870,927,964,992,1021,1050,1092 'bad':347 'basic':174,296,487 'batch':959 'benefit':596 'best':320,1038 'billing/invoice.paid':181,219,264 'brand':1138 'busi':1180 'cancel':786 'card':1135 'cart':303 'cart-checkout-completed-ed12c8bde':302 'cartid':314 'case':475 'certain':863 'ch':1100 'chang':1049,1064 'changedbi':1076 'chargeid':1099 'checkout':304 'chronolog':447 'clear':214 'client':895 'codebases/languages':628 'complet':141,305,696,736,741,781,788 'complete-onboard':740 'completeuseronboard':745 'concept':103 'configur':388 'conflict':357 'consist':271 'console.log':956 'const':410,449,514,540,567,657,697,793,807,904,925,962,970 'consum':1091,1114,1156 'contain':1152 'context':1083,1088,1111,1178 'convent':202 'convert':967 'core':102 'correl':1169 'could':356 'creat':255,545,556,717 'create-subscript':555 'create-tri':544 'createtrialsubscript':541 'critic':835,840,850 'crm':574,584,727 'crm-sync':583,726 'crm.contacts.create':588 'crm/contact.add':689 'crm/contact.added':730 'crmresult':700 'cross':622 'cross-servic':621 'currenc':1109 'cus':184,936,1103 'custom':370,561 'customerid':183,368,935,1102 'dark':1069 'data':134,137,151,157,182,313,426,456,464,500,682,686,690,889,931,976,1028,1060,1084,1096,1155 'date.now':412,881 'day':565 'debug':1132 'debugg':1183 'decoupl':11 'dedup':31 'dedupl':161,297,373,1020 'delay':393 'deliv':422 'deliveri':39,53,394 'describ':252 'design':6,51,63,1037,1147 'detail':655,1106 'differ':371,627,1113 'document':93 'doesn':603 'domain':224 'domain/noun.verb':209 'dot':241,258,261 'downstream':21 'driven':9 'duplic':287 'durabl':384 'earlier':455 'ed12c8bde':306,315 'effect':78 'email':504,521,532,589,705,1065 'email-s':704 'email/welcome.send':681 'email/welcome.sent':708 'emailresult':698 'emit':759 'enough':1087,1177 'environ':918,1144 'error':812,829 'error.code':866 'error.message':830 'error.stack':832 'establish':272 'event':3,8,25,47,50,55,65,77,108,113,127,130,149,156,175,200,251,268,278,290,309,326,352,360,372,379,399,405,438,441,450,469,477,495,513,523,526,548,551,576,579,637,641,645,665,668,707,718,729,757,761,768,772,802,805,894,916,923,952,960,969,971,994,1005,1008,1036,1146,1162 'event-driven':7 'event.data':683,687,691,813 'event.data.customertier':1032 'event.data.email':537,590 'event.data.orderid':1030 'event.data.plan':592 'event.data.stripecustomerid':562 'event.data.userid':712,723,734,746 'eventpayload':145 'everi':111 'exampl':176 'exceed':869 'execut':608,771 'export':903 'express':636,649 'extern':41 'fail':257,619,775,783,790,799,822,852 'failur':602,818,837,864 'fan':15,71,471,489,594,631,670,678 'fan-out':14,70,470,488,593,630,677 'field':1045,1071 'finish':780 'first':378 'focus':82 'format':110 'foundat':58 'fulfil':1025 'fulfillment/order.received':1027 'full':654 'function':133,385,481,509,598,610,620,625,763,770,774,779,785,791,800,808,821,824,836,851,853,997,1016 'function_id.includes':839 'functionid':823 'futur':401,407 'generic':348,366 'getorderitem':965 'go':88 'good':213,223,323 'group':266 'guidanc':101 'guidelin':248 'handl':26,34,75,789,798 'handle-failed-funct':797 'handlefailur':794 'handler':22 'happen':237,254 'hierarchi':263 'high':856,1034 'hour':30,376,425 'id':28,158,162,279,285,301,319,330,335,341,349,354,361,367,517,543,570,660,796,809,811,825,828,854,859,892,908,941,946,953,1000,1116,1123,1170 'idempot':24,68,281,387 'identifi':1098 'immut':1159 'implement':13,23,67,491 'import':899 'includ':754,1086,1153,1168,1184 'inconsist':234 'independ':480,597 'inngest':2,46,49,60,92,112,383,749,758,900,902,905,907,915 'inngest-durable-funct':382 'inngest-ev':1 'inngest-step':748 'inngest.createfunction':516,542,569,659,795,999 'inngest.send':179,300,417,468,497,877,928,993,1014,1051,1093 'inngest/client.ts':898 'inngest/function.cancelled':784 'inngest/function.failed':773,803 'inngest/function.finished':778 'instanc':329 'instead':1012 'intercom/conversation.assigned':229 'inv':1124,1127 'inventory/item.reserved':975 'invoic':332,1122 'invoice-paid':331 'invoiceid':186,334,355 'invoicewaspaid':244 'item':316,940,942,947,973 'item.id':978 'item.quantity':982 'item.warehouseid':984 'item1':317 'item2':318 'itemid':977 'json':116,140 'key':917 'languag':99,107 'language-specif':98 'last4':1136 'later':463 'learn':61 'least':37 'leverag':69 'lifecycl':764 'like':43 'limit':868 'log':817 'log-failur':816 'logger.error':820 'logic':1181 'login':458 'maintain':404,437 'mani':20 'master':48 'match':647 'metadata':194,1130,1140,1185 'might':291 'minut':888 'modifi':1161 'monitor':765 'month':1121 'ms':168 'multipl':294,479,508,673 'must':913 'my-app':909 'name':128,146,180,201,247,311,418,451,459,498,680,684,688,878,929,974,1026,1052,1094 'need':1157 'nest':139 'never':1160 'new':644,906,1070 'new@example.com':1066 'nffrfeufnv2hib':185 'normal':1035 'notat':259 'number':164,1126 'object':117,135,206,216 'object-act':205,215 'onboard':663,737,742 'one':18,476,601 'onehourfromnow':411,421 'option':121,160,165,171 'orchestr':662 'orchestrate-onboard':661 'orchestrateonboard':658 'ord':933 'order':343,406,439,448,1003 'order-ship':342 'order/item.shipped':221 'order/placed':930,1006 'orderid':345,932,966,979,980,1029 'orderitem':963 'orderitems.map':972 'organ':227 'origin':639 'originalrunid':890 'other':606 'paid':333 'parallel':485,607 'paramet':391 'past':249 'pattern':17,54,73,208,211,218,273,473,753 'payload':109,136 'payment':235 'payment/charge.succeeded':1095 'paymentmethod':1133 'per':308 'period':564 'plan':506,591,1119 'practic':321,1039 'prefer':1067 'prefix':225,265 'premium':1033 'prevent':286 'primari':1097 'principl':1148 'prioriti':1031 'pro':507,1120 'process':288,402,445,486,1002 'process-ord':1001 'product':921,1145 'promise.all':702 'properti':122,124 'provid':1176 'purchas':466 'python':86 'quantiti':944,949,981 'rate':867 're':616 're-run':615 'reason':1079 'recept':380 'recommend':210 'record':152 'refer':89,651 'relat':267 'reliabl':483,1018 'replay':614 'request':1081 'requir':119,123,148,155 'respond':510 'result':926 'result.ids':957 'retri':777,862,874,885 'retry/function.requested':879 'return':534,559,587,744,847,876,951 'rich':1082 'robust':64 'run':599,611,617,810,827,858,891 'runid':826,857 'schedul':398,408,873 'schedule-retri':872 'schema':66,142,172,1040,1048,1058,1074,1163 'see':381,648,747 'select':613 'self':1151 'self-contain':1150 'send':493,519,531,844,893,985,995,1165 'send-alert':843 'send-email':530 'send-welcome-email':518 'sendemail':535 'sendwelcomeemail':515 'sent':293,706 'separ':600 'servic':12,623,674 'set':914 'setup':896 'sever':855 'share':350 'ship':344 'signup':338 'simultan':612 'singl':494,922 'skill':80 'skill-inngest-events' 'slack/message.posted':230 'sourc':42,1141 'source-inngest' 'specif':100,324 'stack':831 'step':527,552,580,669,750,806,1009 'step.invoke':755 'step.run':529,554,582,739,815,842,871 'step.sendevent':676,1011,1022 'step.waitforevent':703,714,725 'stick':275 'storefront/cart.checkout.completed':312 'string':129,147,153,159,170 'stripe':44,1142 'stripe.subscriptions.create':560 'stripe/customer.created':228 'sub':1117 'subresult':699 'subscript':557,716,1115 'subscription-cr':715 'subscription/trial.create':685 'subscription/trial.created':719 'sync':585,728 'syntax':650 'system':76,756,760,767 't12':434 'templat':538 'tens':250 'theme':1068 'time':295 'timeout':709,720,731 'timestamp':166,340,443 'titl':849 'topic-agent-skill-repository' 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agents' 'topic-claude-code-skills' 'topic-cursor-skills' 'topic-openclaw-skills' 'traceabl':1167 'track':955,1047 'trackingnumb':346 'trail':1173 'trial':546,563 'trial/reminder.send':419 'trialexpiresat':430 'trigger':19,132,478,522,547,575,624,640,664,801,1004,1024 'trigger-fulfil':1023 'troubleshoot':1187 'ts':163,390,420,453,461,880 'type':126,131,144,150,310,327,353,1134 'typescript':84,125,143,177,212,298,322,409,440,492,656,769,792,897,924,961,998,1042,1085 'unclear':232 'underscor':243 'uniqu':307 'unix':167 'updat':239,256 'usd':1110 'use':4,203,240,260,284,397,474,1010,1043 'user':190,238,337,363,428,502,1062,1077,1080 'user-act':362 'user-signup':336 'user/action.performed':452,460 'user/profile.updated':220,1053 'user/signup.completed':499,524,549,577,666 'user@example.com':505 'userid':189,339,427,501,1061 'v':169,1054 'v2':1073 'variabl':919 'verbos':246 'version':173,1041,1044,1059 'visa':1139 'wait':692 'waitforev':634 'warehouseid':983 'web':45 'webhook':1143 'webhook/stripe.received':270 'welcom':520,539 'window':32,374 'workflow':10 'www.inngest.com':95 'www.inngest.com/llms.txt)':94","prices":[{"id":"63f5e60a-9185-488d-82dd-d08e6e5fe7b0","listingId":"0404d68e-2631-4c32-9719-a02b6151a59e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"inngest","category":"inngest-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:06:56.690Z"}],"sources":[{"listingId":"0404d68e-2631-4c32-9719-a02b6151a59e","source":"github","sourceId":"inngest/inngest-skills/inngest-events","sourceUrl":"https://github.com/inngest/inngest-skills/tree/main/skills/inngest-events","isPrimary":false,"firstSeenAt":"2026-04-18T23:06:56.690Z","lastSeenAt":"2026-05-18T19:05:31.189Z"},{"listingId":"0404d68e-2631-4c32-9719-a02b6151a59e","source":"skills_sh","sourceId":"inngest/inngest-skills/inngest-events","sourceUrl":"https://skills.sh/inngest/inngest-skills/inngest-events","isPrimary":true,"firstSeenAt":"2026-04-23T00:40:56.403Z","lastSeenAt":"2026-05-07T22:40:47.392Z"}],"details":{"listingId":"0404d68e-2631-4c32-9719-a02b6151a59e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"inngest","slug":"inngest-events","github":{"repo":"inngest/inngest-skills","stars":22,"topics":["agent-skill-repository","agent-skills","agentic-skills","ai-agents","claude-code-skills","cursor-skills","openclaw-skills"],"license":"other","html_url":"https://github.com/inngest/inngest-skills","pushed_at":"2026-05-06T18:21:48Z","description":"Agent Skills for building with Inngest","skill_md_sha":"83ae6d1f56c3cbdb4087ac9fd996d9ea44c59d1d","skill_md_path":"skills/inngest-events/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/inngest/inngest-skills/tree/main/skills/inngest-events"},"layout":"multi","source":"github","category":"inngest-skills","frontmatter":{"name":"inngest-events","description":"Use when designing event-driven workflows, decoupling services, implementing fan-out patterns (one trigger, many downstream handlers), implementing idempotent event handling with IDs (24-hour dedupe window), or handling at-least-once delivery from external sources like Stripe webhooks. Covers Inngest event schema, payload format, naming conventions, IDs for idempotency, the ts param, fan-out patterns, and system events like inngest/function.failed."},"skills_sh_url":"https://skills.sh/inngest/inngest-skills/inngest-events"},"updatedAt":"2026-05-18T19:05:31.189Z"}}