[{"data":1,"prerenderedAt":548},["ShallowReactive",2],{"navigation_docs":3,"-concepts-revenue-and-attribution":233,"-concepts-revenue-and-attribution-surround":543},[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":108,"body":235,"description":534,"extension":535,"links":536,"meta":537,"navigation":538,"path":109,"seo":539,"stem":110,"__hash__":542},"docs\u002F3.concepts\u002F08.revenue-and-attribution.md",{"type":236,"value":237,"toc":524},"minimark",[238,242,247,348,351,358,362,365,381,384,387,394,398,430,433,436,452,456,459,493,507,511,518],[239,240,241],"p",{},"Rabolic only counts revenue that a server confirmed. A page view or an app can't report a sale, so the numbers can be trusted.",[243,244,246],"h2",{"id":245},"where-revenue-comes-from","Where revenue comes from",[248,249,250,265],"table",{},[251,252,253],"thead",{},[254,255,256,260,263],"tr",{},[257,258,259],"th",{},"Source",[257,261,262],{},"How",[257,264,74],{},[266,267,268,295],"tbody",{},[254,269,270,277,284],{},[271,272,273],"td",{},[274,275,276],"strong",{},"Dodo Payments",[271,278,279,280,283],{},"Connect it in ",[274,281,282],{},"Integrations → Payments"," with its webhook signing secret, then add the webhook URL Rabolic shows to Dodo",[271,285,286,287,291,292],{},"Successful payments and refunds arrive as ",[288,289,290],"code",{},"$purchase"," and ",[288,293,294],{},"$refund",[254,296,297,302,326],{},[271,298,299],{},[274,300,301],{},"Your server",[271,303,304,307,308,291,311,314,315,321,322,325],{},[288,305,306],{},"purchase()",", ",[288,309,310],{},"renewal()",[288,312,313],{},"refund()"," in ",[316,317,318],"a",{"href":59},[288,319,320],{},"@rabolic\u002Fnode",", or the ",[316,323,324],{"href":64},"HTTP API",", with a secret key",[271,327,328,307,330,307,333,335,336,307,339,307,342,307,345],{},[288,329,290],{},[288,331,332],{},"$renewal",[288,334,294],{}," with ",[288,337,338],{},"amount",[288,340,341],{},"currency",[288,343,344],{},"transaction_id",[288,346,347],{},"product",[239,349,350],{},"Payments from any other provider, including Stripe and in-app purchases, can be sent from your server. Rabolic has no Stripe, App Store or Google Play connection yet.",[239,352,353,354,357],{},"Revenue events sent with a publishable key are rejected (",[288,355,356],{},"revenue_needs_secret_key","). Purchase events sent from a browser or app never count as revenue.",[243,359,361],{"id":360},"one-revenue-source-per-project","One revenue source per project",[239,363,364],{},"A project's revenue comes from exactly one place:",[366,367,368,375],"ul",{},[369,370,371,374],"li",{},[274,372,373],{},"With Dodo Payments connected,"," its webhooks are the revenue. Revenue events your server sends are still recorded as events, so funnels and journeys see them, but they add no revenue.",[369,376,377,380],{},[274,378,379],{},"Without a provider,"," the revenue events your server sends are the revenue.",[239,382,383],{},"Why: the two paths describe the same payment with different ids, so they can't be matched reliably, and counting both would double your revenue.",[239,385,386],{},"Rabolic decides when it records each event. Connecting or removing a provider later doesn't rewrite past revenue.",[388,389,390,391,393],"tip",{},"Use Dodo Payments' webhooks if you sell through Dodo. Use ",[288,392,306],{}," from your server for any other provider.",[243,395,397],{"id":396},"linking-a-payment-to-a-person","Linking a payment to a person",[366,399,400,417],{},[369,401,402,405,406,409,410,413,414,416],{},[274,403,404],{},"From your server:"," pass the ",[288,407,408],{},"userId"," (or ",[288,411,412],{},"anonymousId",") to ",[288,415,306],{},".",[369,418,419,422,423,426,427,429],{},[274,420,421],{},"With Dodo Payments:"," put ",[288,424,425],{},"checkoutMetadata({ userId })"," from ",[288,428,320],{}," in the checkout session's metadata, or the anonymous id before someone has an account. The webhook then links the payment to the person.",[239,431,432],{},"A payment is recorded once per provider and transaction id. A webhook delivered twice, or a retried request from your server, is kept once.",[243,434,435],{"id":341},"Currency",[366,437,438,443,446,449],{},[369,439,440,441,416],{},"Each project reports in its own currency, set in ",[274,442,178],{},[369,444,445],{},"Each purchase is converted into the project's currency at the exchange rate of the day it happened, using the European Central Bank's daily reference rates. The original amount and currency are kept.",[369,447,448],{},"Organization totals are converted into the organization's roll-up currency the same way, day by day. Changing it recomputes from the stored originals and those days' rates.",[369,450,451],{},"A project without a revenue source shows no revenue, not 0.",[243,453,455],{"id":454},"attribution","Attribution",[239,457,458],{},"Rabolic credits each purchase to a channel in two models:",[248,460,461,471],{},[251,462,463],{},[254,464,465,468],{},[257,466,467],{},"Model",[257,469,470],{},"Credits the purchase to",[266,472,473,483],{},[254,474,475,480],{},[271,476,477],{},[274,478,479],{},"First touch",[271,481,482],{},"The channel of the buyer's first session",[254,484,485,490],{},[271,486,487],{},[274,488,489],{},"Last touch",[271,491,492],{},"The channel of their last session before the purchase",[366,494,495,498,501],{},[369,496,497],{},"Each purchase is credited to one channel in each model, never split or counted twice.",[369,499,500],{},"Attribution looks back up to 90 days before the start of the date range. A purchase with no session in that time is credited to Direct.",[369,502,503,504,416],{},"The project's default model is set in ",[274,505,506],{},"Project settings → Project",[243,508,510],{"id":509},"the-numbers","The numbers",[239,512,513,514,517],{},"Gross revenue, net revenue (gross minus refunds; store fees aren't deducted), refunds (on the day of the refund), purchases, average order value, paying users, revenue per user, revenue by platform and source, and lifetime value by first source. ",[274,515,516],{},"MRR"," is approximated from renewals in the last 30 days and shows only when there are renewals.",[239,519,520,521,416],{},"See ",[316,522,523],{"href":165},"Revenue in the dashboard",{"title":525,"searchDepth":526,"depth":526,"links":527},"",2,[528,529,530,531,532,533],{"id":245,"depth":526,"text":246},{"id":360,"depth":526,"text":361},{"id":396,"depth":526,"text":397},{"id":341,"depth":526,"text":435},{"id":454,"depth":526,"text":455},{"id":509,"depth":526,"text":510},"Where Rabolic revenue comes from (Dodo Payments webhooks or your server with a secret key), the one-revenue-source rule, currency conversion, linking payments to people, and first- and last-touch attribution.","md",null,{},{"icon":111},{"title":540,"description":541},"Revenue sources and attribution","Where Rabolic revenue comes from (Dodo Payments webhooks or your server with a secret key), the one-revenue-source rule, currency conversion at the day's rate, linking payments to people, and first- and last-touch attribution.","fSTD2iCaW0eK6nl3FRxsirwLn5stZMn2-gPH-_pBjNY",[544,546],{"title":103,"path":104,"stem":105,"description":545,"icon":106,"children":-1},"How Rabolic retention cohorts work. Cohort start and return events, daily, weekly and monthly intervals in the project's time zone, and N-day, unbounded and rolling counts.",{"title":113,"path":114,"stem":115,"description":547,"icon":116,"children":-1},"What Rabolic collects and never collects, IP addresses (never stored), location from DB-IP, consent states, cookieless mode, sensitive properties and privacy requests.",1794242364670]