[{"data":1,"prerenderedAt":1114},["ShallowReactive",2],{"navigation_docs":3,"-sdks-node":233,"-sdks-node-surround":1109},[4,36,67,122,187,207,223],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"What is Rabolic","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-zap",{"title":21,"path":22,"stem":23,"icon":24},"Keys","\u002Fgetting-started\u002Fkeys","1.getting-started\u002F3.keys","i-lucide-key-round",{"title":26,"path":27,"stem":28,"icon":29},"Setup CLI","\u002Fgetting-started\u002Fsetup-cli","1.getting-started\u002F4.setup-cli","i-lucide-terminal",{"title":31,"path":32,"stem":33,"icon":34},"Trial","\u002Fgetting-started\u002Ftrial","1.getting-started\u002F5.trial","i-lucide-hourglass",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"SDKs and API","i-lucide-code","\u002Fsdks","2.sdks",[42,47,52,57,62],{"title":43,"path":44,"stem":45,"icon":46},"Web","\u002Fsdks\u002Fweb","2.sdks\u002F1.web","i-lucide-globe",{"title":48,"path":49,"stem":50,"icon":51},"React Native and Expo","\u002Fsdks\u002Freact-native","2.sdks\u002F2.react-native","i-simple-icons-react",{"title":53,"path":54,"stem":55,"icon":56},"Flutter","\u002Fsdks\u002Fflutter","2.sdks\u002F3.flutter","i-simple-icons-flutter",{"title":58,"path":59,"stem":60,"icon":61},"Node.js","\u002Fsdks\u002Fnode","2.sdks\u002F4.node","i-simple-icons-nodedotjs",{"title":63,"path":64,"stem":65,"icon":66},"Ingest HTTP API","\u002Fsdks\u002Fhttp-api","2.sdks\u002F5.http-api","i-lucide-send",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":35},"Concepts","i-lucide-lightbulb","\u002Fconcepts","3.concepts",[73,77,82,87,92,97,102,107,112,117],{"title":74,"path":75,"stem":76,"icon":19},"Events","\u002Fconcepts\u002Fevents","3.concepts\u002F01.events",{"title":78,"path":79,"stem":80,"icon":81},"Identity","\u002Fconcepts\u002Fidentity","3.concepts\u002F02.identity","i-lucide-fingerprint",{"title":83,"path":84,"stem":85,"icon":86},"Sessions","\u002Fconcepts\u002Fsessions","3.concepts\u002F03.sessions","i-lucide-activity",{"title":88,"path":89,"stem":90,"icon":91},"Key events and conversions","\u002Fconcepts\u002Fkey-events-and-conversions","3.concepts\u002F04.key-events-and-conversions","i-lucide-star",{"title":93,"path":94,"stem":95,"icon":96},"Funnels","\u002Fconcepts\u002Ffunnels","3.concepts\u002F05.funnels","i-lucide-filter",{"title":98,"path":99,"stem":100,"icon":101},"Journeys","\u002Fconcepts\u002Fjourneys","3.concepts\u002F06.journeys","i-lucide-route",{"title":103,"path":104,"stem":105,"icon":106},"Retention","\u002Fconcepts\u002Fretention","3.concepts\u002F07.retention","i-lucide-repeat",{"title":108,"path":109,"stem":110,"icon":111},"Revenue and attribution","\u002Fconcepts\u002Frevenue-and-attribution","3.concepts\u002F08.revenue-and-attribution","i-lucide-wallet",{"title":113,"path":114,"stem":115,"icon":116},"Consent and privacy","\u002Fconcepts\u002Fprivacy","3.concepts\u002F09.privacy","i-lucide-shield-check",{"title":118,"path":119,"stem":120,"icon":121},"Data retention","\u002Fconcepts\u002Fdata-retention","3.concepts\u002F10.data-retention","i-lucide-archive",{"title":123,"icon":124,"path":125,"stem":126,"children":127,"page":35},"Using the dashboard","i-lucide-layout-dashboard","\u002Fdashboard","4.dashboard",[128,133,138,143,146,151,154,157,160,163,167,172,177,182],{"title":129,"path":130,"stem":131,"icon":132},"Overview","\u002Fdashboard\u002Foverview","4.dashboard\u002F01.overview","i-lucide-gauge",{"title":134,"path":135,"stem":136,"icon":137},"Live","\u002Fdashboard\u002Flive","4.dashboard\u002F02.live","i-lucide-radio",{"title":139,"path":140,"stem":141,"icon":142},"Analytics","\u002Fdashboard\u002Fanalytics","4.dashboard\u002F03.analytics","i-lucide-bar-chart-3",{"title":74,"path":144,"stem":145,"icon":19},"\u002Fdashboard\u002Fevents","4.dashboard\u002F04.events",{"title":147,"path":148,"stem":149,"icon":150},"Users","\u002Fdashboard\u002Fusers","4.dashboard\u002F05.users","i-lucide-users",{"title":83,"path":152,"stem":153,"icon":86},"\u002Fdashboard\u002Fsessions","4.dashboard\u002F06.sessions",{"title":93,"path":155,"stem":156,"icon":96},"\u002Fdashboard\u002Ffunnels","4.dashboard\u002F07.funnels",{"title":98,"path":158,"stem":159,"icon":101},"\u002Fdashboard\u002Fjourneys","4.dashboard\u002F08.journeys",{"title":103,"path":161,"stem":162,"icon":106},"\u002Fdashboard\u002Fretention","4.dashboard\u002F09.retention",{"title":164,"path":165,"stem":166,"icon":111},"Revenue","\u002Fdashboard\u002Frevenue","4.dashboard\u002F10.revenue",{"title":168,"path":169,"stem":170,"icon":171},"Alerts","\u002Fdashboard\u002Falerts","4.dashboard\u002F11.alerts","i-lucide-bell",{"title":173,"path":174,"stem":175,"icon":176},"Integrations","\u002Fdashboard\u002Fintegrations","4.dashboard\u002F12.integrations","i-lucide-plug-zap",{"title":178,"path":179,"stem":180,"icon":181},"Project settings","\u002Fdashboard\u002Fproject-settings","4.dashboard\u002F13.project-settings","i-lucide-settings",{"title":183,"path":184,"stem":185,"icon":186},"Organizations and roles","\u002Fdashboard\u002Forganizations-and-roles","4.dashboard\u002F14.organizations-and-roles","i-lucide-building-2",{"title":188,"icon":189,"path":190,"stem":191,"children":192,"page":35},"Plans and billing","i-lucide-credit-card","\u002Fbilling","5.billing",[193,198,202],{"title":194,"path":195,"stem":196,"icon":197},"Plans","\u002Fbilling\u002Fplans","5.billing\u002F1.plans","i-lucide-tags",{"title":199,"path":200,"stem":201,"icon":132},"Usage and overage","\u002Fbilling\u002Fusage-and-overage","5.billing\u002F2.usage-and-overage",{"title":203,"path":204,"stem":205,"icon":206},"Read-only and deletion","\u002Fbilling\u002Fread-only-and-deletion","5.billing\u002F3.read-only-and-deletion","i-lucide-lock",{"title":208,"icon":209,"path":210,"stem":211,"children":212,"page":35},"Limits and troubleshooting","i-lucide-life-buoy","\u002Flimits","6.limits",[213,218],{"title":214,"path":215,"stem":216,"icon":217},"Limits","\u002Flimits\u002Flimits","6.limits\u002F1.limits","i-lucide-ruler",{"title":219,"path":220,"stem":221,"icon":222},"Events not showing","\u002Flimits\u002Ftroubleshooting","6.limits\u002F2.troubleshooting","i-lucide-search-check",{"title":224,"icon":225,"path":226,"stem":227,"children":228,"page":35},"AI connector","i-lucide-sparkles","\u002Fai","7.ai",[229],{"title":224,"path":230,"stem":231,"icon":232},"\u002Fai\u002Fconnector","7.ai\u002F1.connector","i-lucide-plug",{"id":234,"title":58,"body":235,"description":1100,"extension":1101,"links":1102,"meta":1103,"navigation":1104,"path":59,"seo":1105,"stem":60,"__hash__":1108},"docs\u002F2.sdks\u002F4.node.md",{"type":236,"value":237,"toc":1089},"minimark",[238,258,280,285,311,330,334,490,497,501,631,635,749,756,759,767,794,804,809,812,878,898,915,955,963,967,996,1000,1053,1057,1085],[239,240,241,245,246,249,250,257],"p",{},[242,243,244],"code",{},"@rabolic\u002Fnode"," is Rabolic for servers: server-side events, verified revenue and checkout metadata. It needs Node 20+ (global ",[242,247,248],{},"fetch",") and has no runtime dependencies. Source: ",[251,252,256],"a",{"href":253,"rel":254},"https:\u002F\u002Fgithub.com\u002Frabolic\u002Fsdks\u002Ftree\u002Fmain\u002Fjs\u002Fnode",[255],"nofollow","github.com\u002Frabolic\u002Fsdks\u002Fjs\u002Fnode",".",[239,259,260,261,265,266,269,270,273,274,277,278,257],{},"Use a ",[262,263,264],"strong",{},"secret key",": ",[242,267,268],{},"rb_live_…"," for production, ",[242,271,272],{},"rb_test_…"," for staging and development. Publishable keys (",[242,275,276],{},"rb_pub_…",") are refused. Keep the key out of browsers and apps. See ",[251,279,21],{"href":22},[281,282,284],"h2",{"id":283},"install","Install",[286,287,293],"pre",{"className":288,"code":289,"filename":290,"language":291,"meta":292,"style":292},"language-bash shiki shiki-themes github-light-default github-light-default github-dark-default","npm install @rabolic\u002Fnode\n","Terminal","bash","",[242,294,295],{"__ignoreMap":292},[296,297,300,304,308],"span",{"class":298,"line":299},"line",1,[296,301,303],{"class":302},"sQJ0q","npm",[296,305,307],{"class":306},"s-BGO"," install",[296,309,310],{"class":306}," @rabolic\u002Fnode\n",[239,312,313,318,319,322,323,326,327,257],{},[251,314,315],{"href":27},[242,316,317],{},"npx rabolic init"," in a Node.js project does this, adds ",[242,320,321],{},"src\u002Frabolic.ts"," and puts ",[242,324,325],{},"RABOLIC_SECRET_KEY"," in ",[242,328,329],{},".env",[281,331,333],{"id":332},"initialize-and-send-an-event","Initialize and send an event",[286,335,339],{"className":336,"code":337,"language":338,"meta":292,"style":292},"language-ts shiki shiki-themes github-light-default github-light-default github-dark-default","import { Rabolic } from '@rabolic\u002Fnode'\n\nconst rabolic = new Rabolic({ secretKey: process.env.RABOLIC_SECRET_KEY })\n\nawait rabolic.track({\n  userId: 'usr_8f2k1x9q',\n  event: 'subscription_renewed',\n  properties: { amount: 9.99, currency: 'USD' },\n  idempotencyKey: invoice.id,\n})\n\n\u002F\u002F before the process exits (and at the end of a serverless invocation)\nawait rabolic.shutdown()\n","ts",[242,340,341,357,364,392,397,412,424,435,453,459,465,470,477],{"__ignoreMap":292},[296,342,343,347,351,354],{"class":298,"line":299},[296,344,346],{"class":345},"s5nWI","import",[296,348,350],{"class":349},"s_bOF"," { Rabolic } ",[296,352,353],{"class":345},"from",[296,355,356],{"class":306}," '@rabolic\u002Fnode'\n",[296,358,360],{"class":298,"line":359},2,[296,361,363],{"emptyLinePlaceholder":362},true,"\n",[296,365,367,370,374,377,380,384,387,389],{"class":298,"line":366},3,[296,368,369],{"class":345},"const",[296,371,373],{"class":372},"sDkKp"," rabolic",[296,375,376],{"class":345}," =",[296,378,379],{"class":345}," new",[296,381,383],{"class":382},"sd69k"," Rabolic",[296,385,386],{"class":349},"({ secretKey: process.env.",[296,388,325],{"class":372},[296,390,391],{"class":349}," })\n",[296,393,395],{"class":298,"line":394},4,[296,396,363],{"emptyLinePlaceholder":362},[296,398,400,403,406,409],{"class":298,"line":399},5,[296,401,402],{"class":345},"await",[296,404,405],{"class":349}," rabolic.",[296,407,408],{"class":382},"track",[296,410,411],{"class":349},"({\n",[296,413,415,418,421],{"class":298,"line":414},6,[296,416,417],{"class":349},"  userId: ",[296,419,420],{"class":306},"'usr_8f2k1x9q'",[296,422,423],{"class":349},",\n",[296,425,427,430,433],{"class":298,"line":426},7,[296,428,429],{"class":349},"  event: ",[296,431,432],{"class":306},"'subscription_renewed'",[296,434,423],{"class":349},[296,436,438,441,444,447,450],{"class":298,"line":437},8,[296,439,440],{"class":349},"  properties: { amount: ",[296,442,443],{"class":372},"9.99",[296,445,446],{"class":349},", currency: ",[296,448,449],{"class":306},"'USD'",[296,451,452],{"class":349}," },\n",[296,454,456],{"class":298,"line":455},9,[296,457,458],{"class":349},"  idempotencyKey: invoice.id,\n",[296,460,462],{"class":298,"line":461},10,[296,463,464],{"class":349},"})\n",[296,466,468],{"class":298,"line":467},11,[296,469,363],{"emptyLinePlaceholder":362},[296,471,473],{"class":298,"line":472},12,[296,474,476],{"class":475},"s9BHP","\u002F\u002F before the process exits (and at the end of a serverless invocation)\n",[296,478,480,482,484,487],{"class":298,"line":479},13,[296,481,402],{"class":345},[296,483,405],{"class":349},[296,485,486],{"class":382},"shutdown",[296,488,489],{"class":349},"()\n",[239,491,492,493,496],{},"Create one client per process. Its timers are unref'd, so it never keeps your process alive. Call ",[242,494,495],{},"shutdown()"," to send what is queued.",[281,498,500],{"id":499},"options","Options",[502,503,504,519],"table",{},[505,506,507],"thead",{},[508,509,510,514,517],"tr",{},[511,512,513],"th",{},"Option",[511,515,516],{},"Default",[511,518],{},[520,521,522,544,558,573,588,602,616],"tbody",{},[508,523,524,530,533],{},[525,526,527],"td",{},[242,528,529],{},"secretKey",[525,531,532],{},"required",[525,534,535,537,538,540,541,543],{},[242,536,268],{}," or ",[242,539,272],{},". Publishable keys (",[242,542,276],{},") are refused",[508,545,546,551,556],{},[525,547,548],{},[242,549,550],{},"host",[525,552,553],{},[242,554,555],{},"https:\u002F\u002Fingest.rabolic.com",[525,557],{},[508,559,560,565,570],{},[525,561,562],{},[242,563,564],{},"flushAt",[525,566,567],{},[242,568,569],{},"20",[525,571,572],{},"Send when this many events are queued (1–500)",[508,574,575,580,585],{},[525,576,577],{},[242,578,579],{},"flushIntervalMs",[525,581,582],{},[242,583,584],{},"10000",[525,586,587],{},"Send at least this often",[508,589,590,595,599],{},[525,591,592],{},[242,593,594],{},"maxQueueSize",[525,596,597],{},[242,598,584],{},[525,600,601],{},"Kept in memory; the oldest are dropped beyond it",[508,603,604,609,613],{},[525,605,606],{},[242,607,608],{},"timeoutMs",[525,610,611],{},[242,612,584],{},[525,614,615],{},"Per request",[508,617,618,623,628],{},[525,619,620],{},[242,621,622],{},"debug",[525,624,625],{},[242,626,627],{},"false",[525,629,630],{},"Log every call",[281,632,634],{"id":633},"api","API",[502,636,637,647],{},[505,638,639],{},[508,640,641,644],{},[511,642,643],{},"Method",[511,645,646],{},"Does",[520,648,649,659,673,717,727,736],{},[508,650,651,656],{},[525,652,653],{},[242,654,655],{},"track({ event, userId?, anonymousId?, properties?, timestamp?, idempotencyKey? })",[525,657,658],{},"Queues a custom event. Resolves once queued",[508,660,661,666],{},[525,662,663],{},[242,664,665],{},"identify({ userId, anonymousId?, traits? })",[525,667,668,669,672],{},"Sets person traits; with ",[242,670,671],{},"anonymousId",", links that visitor to the user",[508,674,675,687],{},[525,676,677,680,681,680,684],{},[242,678,679],{},"purchase"," \u002F ",[242,682,683],{},"renewal",[242,685,686],{},"refund({ userId?, anonymousId?, amount, currency, transactionId, product, properties?, timestamp?, idempotencyKey? })",[525,688,689,690,693,694,693,697,700,701,693,704,693,707,693,710,713,714],{},"Verified revenue: ",[242,691,692],{},"$purchase",", ",[242,695,696],{},"$renewal",[242,698,699],{},"$refund"," with ",[242,702,703],{},"amount",[242,705,706],{},"currency",[242,708,709],{},"transaction_id",[242,711,712],{},"product",". The idempotency key defaults to ",[242,715,716],{},"transactionId",[508,718,719,724],{},[525,720,721],{},[242,722,723],{},"flush()",[525,725,726],{},"Sends the queue. Respects a backoff the server asked for",[508,728,729,733],{},[525,730,731],{},[242,732,495],{},[525,734,735],{},"Stops the timer and sends everything, skipping any backoff wait. Idempotent; later events are dropped",[508,737,738,743],{},[525,739,740],{},[242,741,742],{},"checkoutMetadata({ userId?, anonymousId? })",[525,744,745,748],{},[242,746,747],{},"{ rabolic_user_id?, rabolic_anonymous_id? }"," for Dodo Payments checkout metadata, so the payment webhook links the revenue to the person. Also a standalone export",[239,750,751,752,755],{},"Calls never throw or reject; invalid ones are dropped and, with ",[242,753,754],{},"debug: true",", logged. The constructor does throw for a missing or wrong key: that is a deployment bug, not a tracking call.",[281,757,78],{"id":758},"identity",[239,760,761,762,537,765,257],{},"Every event needs ",[242,763,764],{},"userId",[242,766,671],{},[768,769,770,781,784],"ul",{},[771,772,773,774,776,777,780],"li",{},"With only ",[242,775,764],{},", it is also sent as the ",[242,778,779],{},"anonymous_id"," (the protocol requires one), so it must then be at most 128 characters. The server treats it as a user without a device id.",[771,782,783],{},"With both, the event belongs to that visitor and that user.",[771,785,786,789,790,793],{},[242,787,788],{},"identify({ userId, anonymousId })"," links a website or app visitor to the user. That helps when sign-up happens on your backend: pass the anonymous id from the browser (",[242,791,792],{},"rabolic.getAnonymousId()"," in the web SDK) to your server.",[239,795,796,797,800,801,257],{},"Server events carry no ",[242,798,799],{},"context.platform",". Rabolic gives them the person's last client platform from the past 24 hours, else ",[242,802,803],{},"server",[239,805,806,807,257],{},"See ",[251,808,78],{"href":79},[281,810,164],{"id":811},"revenue",[286,813,815],{"className":336,"code":814,"language":338,"meta":292,"style":292},"await rabolic.purchase({\n  userId: 'usr_8f2k1x9q',\n  amount: 49,\n  currency: 'USD',\n  transactionId: 'pay_123',\n  product: 'pro_yearly',\n})\n",[242,816,817,827,835,845,854,864,874],{"__ignoreMap":292},[296,818,819,821,823,825],{"class":298,"line":299},[296,820,402],{"class":345},[296,822,405],{"class":349},[296,824,679],{"class":382},[296,826,411],{"class":349},[296,828,829,831,833],{"class":298,"line":359},[296,830,417],{"class":349},[296,832,420],{"class":306},[296,834,423],{"class":349},[296,836,837,840,843],{"class":298,"line":366},[296,838,839],{"class":349},"  amount: ",[296,841,842],{"class":372},"49",[296,844,423],{"class":349},[296,846,847,850,852],{"class":298,"line":394},[296,848,849],{"class":349},"  currency: ",[296,851,449],{"class":306},[296,853,423],{"class":349},[296,855,856,859,862],{"class":298,"line":399},[296,857,858],{"class":349},"  transactionId: ",[296,860,861],{"class":306},"'pay_123'",[296,863,423],{"class":349},[296,865,866,869,872],{"class":298,"line":414},[296,867,868],{"class":349},"  product: ",[296,870,871],{"class":306},"'pro_yearly'",[296,873,423],{"class":349},[296,875,876],{"class":298,"line":426},[296,877,464],{"class":349},[239,879,880,693,883,886,887,890,891,693,893,886,895,897],{},[242,881,882],{},"purchase()",[242,884,885],{},"renewal()"," and ",[242,888,889],{},"refund()"," send ",[242,892,692],{},[242,894,696],{},[242,896,699],{},". Only secret keys can send them, so a page view can't fake a sale.",[239,899,900,903,904,693,906,886,908,910,911,914],{},[262,901,902],{},"One revenue source per project."," If the project has Dodo Payments connected in Rabolic, its webhooks are the revenue: ",[242,905,882],{},[242,907,885],{},[242,909,889],{}," are still recorded as events (funnels and journeys use them) but add no revenue, so a payment never counts twice. Use them as the revenue source for any other provider. With Dodo, pass ",[242,912,913],{},"checkoutMetadata()"," to the checkout instead:",[286,916,918],{"className":336,"code":917,"language":338,"meta":292,"style":292},"import { checkoutMetadata } from '@rabolic\u002Fnode'\n\n\u002F\u002F in the metadata of your Dodo Payments checkout session\nconst metadata = checkoutMetadata({ userId: user.id })\n",[242,919,920,931,935,940],{"__ignoreMap":292},[296,921,922,924,927,929],{"class":298,"line":299},[296,923,346],{"class":345},[296,925,926],{"class":349}," { checkoutMetadata } ",[296,928,353],{"class":345},[296,930,356],{"class":306},[296,932,933],{"class":298,"line":359},[296,934,363],{"emptyLinePlaceholder":362},[296,936,937],{"class":298,"line":366},[296,938,939],{"class":475},"\u002F\u002F in the metadata of your Dodo Payments checkout session\n",[296,941,942,944,947,949,952],{"class":298,"line":394},[296,943,369],{"class":345},[296,945,946],{"class":372}," metadata",[296,948,376],{"class":345},[296,950,951],{"class":382}," checkoutMetadata",[296,953,954],{"class":349},"({ userId: user.id })\n",[239,956,957,958,960,961,257],{},"Other providers aren't supported by ",[242,959,913],{}," yet. See ",[251,962,108],{"href":109},[281,964,966],{"id":965},"idempotency","Idempotency",[239,968,969,972,973,976,977,980,981,984,985,988,989,992,993,995],{},[242,970,971],{},"idempotencyKey"," becomes the ",[242,974,975],{},"event_id",": UUIDv5 (SHA-1) of ",[242,978,979],{},"`${event}\\n${idempotencyKey}`"," in the namespace ",[242,982,983],{},"405a74de-a60c-4882-b7da-344cfaaeb42c"," (exported as ",[242,986,987],{},"EVENT_ID_NAMESPACE",", with ",[242,990,991],{},"eventIdFor(event, key)","). A webhook handled twice, or a retry from another process, produces the same id, and the server drops an id it has received in the last 48 hours. The event name is part of the hash, so one invoice id can key both a ",[242,994,696],{}," and a custom event.",[281,997,999],{"id":998},"delivery","Delivery",[768,1001,1002,1012,1019,1033,1043,1046],{},[771,1003,1004,1005,700,1008,1011],{},"Batches of up to 500 events go to ",[242,1006,1007],{},"POST \u002Fv1\u002Fbatch",[242,1009,1010],{},"Authorization: Bearer",", one request at a time.",[771,1013,1014,1015,1018],{},"Server errors (including ",[242,1016,1017],{},"503",") and timeouts are retried with exponential backoff, up to 5 minutes.",[771,1020,1021,1024,1025,1028,1029,1032],{},[242,1022,1023],{},"429"," waits for ",[242,1026,1027],{},"Retry-After",". ",[242,1030,1031],{},"413"," splits the batch.",[771,1034,1035,1038,1039,1042],{},[242,1036,1037],{},"401"," stops sending and keeps the queue. Other ",[242,1040,1041],{},"4xx"," responses drop the batch.",[771,1044,1045],{},"Events still queued after 7 days are dropped.",[771,1047,1048,1049,1052],{},"The server rejects events whose ",[242,1050,1051],{},"timestamp"," is more than 30 days old, so don't backfill older history.",[281,1054,1056],{"id":1055},"privacy-and-limits","Privacy and limits",[768,1058,1059,1066,1079,1082],{},[771,1060,1061,1062,1065],{},"The key is sent only in the ",[242,1063,1064],{},"Authorization"," header and never logged.",[771,1067,1068,1069,693,1072,886,1075,1078],{},"Properties are copied safely (",[242,1070,1071],{},"__proto__",[242,1073,1074],{},"constructor",[242,1076,1077],{},"prototype"," keys are dropped) and capped at 255 keys per level and depth 5.",[771,1080,1081],{},"Events over 32 KB (32,768 bytes of UTF-8 JSON) are dropped; the server applies the same limit.",[771,1083,1084],{},"Events sent with a secret key get no location lookup.",[1086,1087,1088],"style",{},"html pre.shiki code .sQJ0q, html code.shiki .sQJ0q{--shiki-light:#953800;--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .s-BGO, html code.shiki .s-BGO{--shiki-light:#0A3069;--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s5nWI, html code.shiki .s5nWI{--shiki-light:#CF222E;--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s_bOF, html code.shiki .s_bOF{--shiki-light:#1F2328;--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sDkKp, html code.shiki .sDkKp{--shiki-light:#0550AE;--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sd69k, html code.shiki .sd69k{--shiki-light:#8250DF;--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .s9BHP, html code.shiki .s9BHP{--shiki-light:#6E7781;--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":292,"searchDepth":359,"depth":359,"links":1090},[1091,1092,1093,1094,1095,1096,1097,1098,1099],{"id":283,"depth":359,"text":284},{"id":332,"depth":359,"text":333},{"id":499,"depth":359,"text":500},{"id":633,"depth":359,"text":634},{"id":758,"depth":359,"text":78},{"id":811,"depth":359,"text":164},{"id":965,"depth":359,"text":966},{"id":998,"depth":359,"text":999},{"id":1055,"depth":359,"text":1056},"Install @rabolic\u002Fnode to send server-side events and verified revenue (purchases, renewals, refunds) with a secret key. Options, identity, idempotency, Dodo Payments checkout metadata, delivery and limits.","md",null,{},{"icon":61},{"title":1106,"description":1107},"Node.js SDK (@rabolic\u002Fnode)","Send server-side events and verified revenue (purchases, renewals, refunds) to Rabolic with @rabolic\u002Fnode and a secret key. Options, identity, idempotency, Dodo Payments checkout metadata, delivery and limits.","8UP6nviHnr9fH1a6cHXKIHfBWB7xORK19xgKbC716wk",[1110,1112],{"title":53,"path":54,"stem":55,"description":1111,"icon":56,"children":-1},"Install rabolic_flutter for iOS, Android and Flutter web. Configuration, lifecycle events, screens with Navigator, go_router and auto_route, identity, in-app purchase tokens, deep links, consent, app store privacy forms and limits.",{"title":63,"path":64,"stem":65,"description":1113,"icon":66,"children":-1},"Send events to Rabolic from any language with POST \u002Fv1\u002Fbatch. Authentication, the batch envelope and event fields, reserved events, responses and retries, rejection reasons, deduplication, clock correction and remote config.",1794242363863]