{"id":"0404d68e-2631-4c32-9719-a02b6151a59e","shortId":"zGFukT","kind":"skill","title":"inngest-events","tagline":"Design and send Inngest events. Covers event schema and payload format, naming conventions, IDs for idempotency, the ts param, fan-out patterns, and system events like inngest/function.failed.","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.458","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 17 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-04-23T01:02:09.016Z","embedding":null,"createdAt":"2026-04-18T23:06:56.690Z","updatedAt":"2026-04-23T01:02:09.016Z","lastSeenAt":"2026-04-23T01:02:09.016Z","tsv":"'-001':1115 '-01':1042 '-02':418 '-15':419 '-15.1':1043 '-2024':1114 '/llms.txt)':82 '/references/expressions.md':638 '00':421 '00z':422 '012':1111 '01hq8ptaesbzpbds8jtrzzyy3s':944 '03028hf09j2d02':177 '1':410,929,936,1135 '1000':179,401,870 '123':415,489,920,1049,1087 '14':552 '1640995200000':440 '1640995260000':448 '1j5g2n2ezvkylo2c0z1z2z3z':174,183 '2':931,934,1144 '2024':417,1041 '24':361 '2500':925,1094 '3':1152 '4':1160 '4242':1123 '456':923,1064,1090 '5':868,873,1168 '512kb':977 '5m':696,707,718 '60':399,400,869 '789':1104 'accountid':181 'accountnam':184 'acct':182 'acme.ai':185 'across':91,337 'action':193,203,350,443,451,1161 'add':558 'add-to-crm':557 'addit':738 'addtocrm':554 'advanc':615 'affect':591 'ai/summary.completed':208 'alert':819,831 'alerting.sendalert':834 'amount':178,924,1091,1093 'api/user.created':255 'app':897 'appli':90 'async':511,519,536,544,564,572,628,653,729,790,805,832,861,993 'async.data.userid':699,710,721 'audit':1158 'auditinfo':1061 'auto':847 'auto-retri':846 'avail':752 'avoid':217 'await':164,285,402,453,482,514,539,567,661,687,724,800,827,856,913,950,978,1007,1036,1078 'bad':333 'basic':160,282,473 'batch':945 'benefit':582 'best':306,1024 'billing/invoice.paid':167,205,250 'brand':1124 'busi':1166 'cancel':772 'card':1121 'cart':289 'cart-checkout-completed-ed12c8bde':288 'cartid':300 'case':461 'certain':849 'ch':1086 'chang':1035,1050 'changedbi':1062 'chargeid':1085 'checkout':290 'chronolog':433 'clear':200 'client':881 'codebases/languages':614 'complet':127,291,682,722,727,767,774 'complete-onboard':726 'completeuseronboard':731 'concept':89 'configur':374 'conflict':343 'consist':257 'console.log':942 'const':396,435,500,526,553,643,683,779,793,890,911,948,956 'consum':1077,1100,1142 'contain':1138 'context':1069,1074,1097,1164 'convent':16,188 'convert':953 'core':88 'correl':1155 'could':342 'cover':9 'creat':241,531,542,703 'create-subscript':541 'create-tri':530 'createtrialsubscript':527 'critic':821,826,836 'crm':560,570,713 'crm-sync':569,712 'crm.contacts.create':574 'crm/contact.add':675 'crm/contact.added':716 'crmresult':686 'cross':608 'cross-servic':607 'currenc':1095 'cus':170,922,1089 'custom':356,547 'customerid':169,354,921,1088 'dark':1055 'data':120,123,137,143,168,299,412,442,450,486,668,672,676,875,917,962,1014,1046,1070,1082,1141 'date.now':398,867 'day':551 'debug':1118 'debugg':1169 'dedupl':147,283,359,1006 'delay':379 'deliv':408 'deliveri':39,380 'describ':238 'design':4,37,49,1023,1133 'detail':641,1092 'differ':357,613,1099 'document':79 'doesn':589 'domain':210 'domain/noun.verb':195 'dot':227,244,247 'duplic':273 'durabl':370 'earlier':441 'ed12c8bde':292,301 'effect':64 'email':490,507,518,575,691,1051 'email-s':690 'email/welcome.send':667 'email/welcome.sent':694 'emailresult':684 'emit':745 'enough':1073,1163 'environ':904,1130 'error':798,815 'error.code':852 'error.message':816 'error.stack':818 'establish':258 'event':3,8,10,29,33,36,41,51,63,94,99,113,116,135,142,161,186,237,254,264,276,295,312,338,346,358,365,385,391,424,427,436,455,463,481,499,509,512,534,537,562,565,623,627,631,651,654,693,704,715,743,747,754,758,788,791,880,902,909,938,946,955,957,980,991,994,1022,1132,1148 'event.data':669,673,677,799 'event.data.customertier':1018 'event.data.email':523,576 'event.data.orderid':1016 'event.data.plan':578 'event.data.stripecustomerid':548 'event.data.userid':698,709,720,732 'eventpayload':131 'everi':97 'exampl':162 'exceed':855 'execut':594,757 'export':889 'express':622,635 'fail':243,605,761,769,776,785,808,838 'failur':588,804,823,850 'fan':24,57,457,475,580,617,656,664 'fan-out':23,56,456,474,579,616,663 'field':1031,1057 'finish':766 'first':364 'focus':68 'format':14,96 'foundat':44 'fulfil':1011 'fulfillment/order.received':1013 'full':640 'function':119,371,467,495,584,596,606,611,749,756,760,765,771,777,786,794,807,810,822,837,839,983,1002 'function_id.includes':825 'functionid':809 'futur':387,393 'generic':334,352 'getorderitem':951 'go':74 'good':199,209,309 'group':252 'guidanc':87 'guidelin':234 'handl':61,775,784 'handle-failed-funct':783 'handlefailur':780 'happen':223,240 'hierarchi':249 'high':842,1020 'hour':362,411 'id':17,144,148,265,271,287,305,316,321,327,335,340,347,353,503,529,556,646,782,795,797,811,814,840,845,878,894,927,932,939,986,1102,1109,1156 'idempot':19,54,267,373 'identifi':1084 'immut':1145 'implement':53,477 'import':885 'includ':740,1072,1139,1154,1170 'inconsist':220 'independ':466,583 'inngest':2,7,32,35,46,78,98,369,735,744,886,888,891,893,901 'inngest-durable-funct':368 'inngest-ev':1 'inngest-step':734 'inngest.createfunction':502,528,555,645,781,985 'inngest.send':165,286,403,454,483,863,914,979,1000,1037,1079 'inngest/client.ts':884 'inngest/function.cancelled':770 'inngest/function.failed':31,759,789 'inngest/function.finished':764 'instanc':315 'instead':998 'intercom/conversation.assigned':215 'inv':1110,1113 'inventory/item.reserved':961 'invoic':318,1108 'invoice-paid':317 'invoiceid':172,320,341 'invoicewaspaid':230 'item':302,926,928,933,959 'item.id':964 'item.quantity':968 'item.warehouseid':970 'item1':303 'item2':304 'itemid':963 'json':102,126 'key':903 'languag':85,93 'language-specif':84 'last4':1122 'later':449 'learn':47 'leverag':55 'lifecycl':750 'like':30 'limit':854 'log':803 'log-failur':802 'logger.error':806 'logic':1167 'login':444 'maintain':390,423 'master':34 'match':633 'metadata':180,1116,1126,1171 'might':277 'minut':874 'modifi':1147 'monitor':751 'month':1107 'ms':154 'multipl':280,465,494,659 'must':899 'my-app':895 'name':15,114,132,166,187,233,297,404,437,445,484,666,670,674,864,915,960,1012,1038,1080 'need':1143 'nest':125 'never':1146 'new':630,892,1056 'new@example.com':1052 'nffrfeufnv2hib':171 'normal':1021 'notat':245 'number':150,1112 'object':103,121,192,202 'object-act':191,201 'onboard':649,723,728 'one':462,587 'onehourfromnow':397,407 'option':107,146,151,157 'orchestr':648 'orchestrate-onboard':647 'orchestrateonboard':644 'ord':919 'order':329,392,425,434,989 'order-ship':328 'order/item.shipped':207 'order/placed':916,992 'orderid':331,918,952,965,966,1015 'orderitem':949 'orderitems.map':958 'organ':213 'origin':625 'originalrunid':876 'other':592 'paid':319 'parallel':471,593 'param':22 'paramet':377 'past':235 'pattern':26,40,59,194,197,204,259,459,739 'payload':13,95,122 'payment':221 'payment/charge.succeeded':1081 'paymentmethod':1119 'per':294 'period':550 'plan':492,577,1105 'practic':307,1025 'prefer':1053 'prefix':211,251 'premium':1019 'prevent':272 'primari':1083 'principl':1134 'prioriti':1017 'pro':493,1106 'process':274,388,431,472,988 'process-ord':987 'product':907,1131 'promise.all':688 'properti':108,110 'provid':1162 'purchas':452 'python':72 'quantiti':930,935,967 'rate':853 're':602 're-run':601 'reason':1065 'recept':366 'recommend':196 'record':138 'refer':75,637 'relat':253 'reliabl':469,1004 'replay':600 'request':1067 'requir':105,109,134,141 'respond':496 'result':912 'result.ids':943 'retri':763,848,860,871 'retry/function.requested':865 'return':520,545,573,730,833,862,937 'rich':1068 'robust':50 'run':585,597,603,796,813,844,877 'runid':812,843 'schedul':384,394,859 'schedule-retri':858 'schema':11,52,128,158,1026,1034,1044,1060,1149 'see':367,634,733 'select':599 'self':1137 'self-contain':1136 'send':6,479,505,517,830,879,971,981,1151 'send-alert':829 'send-email':516 'send-welcome-email':504 'sendemail':521 'sendwelcomeemail':501 'sent':279,692 'separ':586 'servic':609,660 'set':900 'setup':882 'sever':841 'share':336 'ship':330 'signup':324 'simultan':598 'singl':480,908 'skill':66 'skill-inngest-events' 'slack/message.posted':216 'sourc':1127 'source-inngest' 'specif':86,310 'stack':817 'step':513,538,566,655,736,792,995 'step.invoke':741 'step.run':515,540,568,725,801,828,857 'step.sendevent':662,997,1008 'step.waitforevent':689,700,711 'stick':261 'storefront/cart.checkout.completed':298 'string':115,133,139,145,156 'stripe':1128 'stripe.subscriptions.create':546 'stripe/customer.created':214 'sub':1103 'subresult':685 'subscript':543,702,1101 'subscription-cr':701 'subscription/trial.create':671 'subscription/trial.created':705 'sync':571,714 'syntax':636 'system':28,62,742,746,753 't12':420 'templat':524 'tens':236 'theme':1054 'time':281 'timeout':695,706,717 'timestamp':152,326,429 'titl':835 'topic-agent-skill-repository' 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agents' 'topic-claude-code-skills' 'topic-cursor-skills' 'topic-openclaw-skills' 'traceabl':1153 'track':941,1033 'trackingnumb':332 'trail':1159 'trial':532,549 'trial/reminder.send':405 'trialexpiresat':416 'trigger':118,464,508,533,561,610,626,650,787,990,1010 'trigger-fulfil':1009 'troubleshoot':1173 'ts':21,149,376,406,439,447,866 'type':112,117,130,136,296,313,339,1120 'typescript':70,111,129,163,198,284,308,395,426,478,642,755,778,883,910,947,984,1028,1071 'unclear':218 'underscor':229 'uniqu':293 'unix':153 'updat':225,242 'usd':1096 'use':189,226,246,270,383,460,996,1029 'user':176,224,323,349,414,488,1048,1063,1066 'user-act':348 'user-signup':322 'user/action.performed':438,446 'user/profile.updated':206,1039 'user/signup.completed':485,510,535,563,652 'user@example.com':491 'userid':175,325,413,487,1047 'v':155,1040 'v2':1059 'variabl':905 'verbos':232 'version':159,1027,1030,1045 'visa':1125 'wait':678 'waitforev':620 'warehouseid':969 'webhook':1129 'webhook/stripe.received':256 'welcom':506,525 'window':360 'www.inngest.com':81 'www.inngest.com/llms.txt)':80","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-04-23T01:02:09.016Z"},{"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-04-23T00:40:56.403Z"}],"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":17,"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-04-20T23:35:15Z","description":"Agent Skills for building with Inngest","skill_md_sha":"7ac37f5eefe8ded3143d5e5c0911a15840dd060c","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":"Design and send Inngest events. Covers event schema and 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-04-23T01:02:09.016Z"}}