{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-1"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":16,"y":16,"width":288,"height":68,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-1","type":"text","seed":114,"x":36,"y":35.7,"width":248,"height":28.6,"fontSize":22,"fontFamily":1,"text":"Day| Action","originalText":"Day| Action","textAlign":"left","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-3"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":16,"y":128,"width":288,"height":465,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-3","type":"text","seed":260,"x":36,"y":146,"width":248,"height":429,"fontSize":22,"fontFamily":1,"text":"0 | Charge fails →\nretry in 3 days,\nemail customer\n3 | Retry charge →\nfails → retry in 5\ndays\n8 | Retry charge →\nfails → email \"update\ncard\"\n14 | Final retry →\nfails → cancel\nsubscription\n→ webhook:\n\"customer.subscription\n.deleted\"","originalText":"0 | Charge fails →\nretry in 3 days,\nemail customer\n3 | Retry charge →\nfails → retry in 5\ndays\n8 | Retry charge →\nfails → email \"update\ncard\"\n14 | Final retry →\nfails → cancel\nsubscription\n→ webhook:\n\"customer.subscription\n.deleted\"","textAlign":"left","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#a68a53","backgroundColor":"#fff7e6","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-5"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":16,"y":637,"width":288,"height":1466,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-5","type":"text","seed":406,"x":36,"y":655,"width":248,"height":1430,"fontSize":22,"fontFamily":1,"text":"Subscription Lifecycle\n\n1. Create\nsubscription:\ncustomer=cus_123,\nplan=monthly_pro\n($49/mo)\nbilling_anchor=1st of\nmonth\n\n2. Billing engine (runs\ndaily):\nSELECT\nsubscriptions\nWHERE\nnext_billing_date <=\nNOW()\nAND status =\n'active'\n\n3. For each due\nsubscription:\n→ Create payment\nintent ($49.00)\n→ Attempt charge on\nstored payment\nmethod\n→ If succeeds:\nadvance\nnext_billing_date by\n1 month\n→ If fails: enter\ndunning cycle\n\nDunning (failed\npayment recovery):\n\nProration (mid-cycle\nplan change):\nCustomer upgrades\nfrom $49 → $99 on\nday 15 of 30:\nUnused on old plan:\n$49 × (15/30) =\n$24.50 credit\nRemaining on new\nplan: $99 × (15/30)\n= $49.50 charge\nNet charge: $49.50\n- $24.50 = $25.00","originalText":"Subscription Lifecycle\n\n1. Create\nsubscription:\ncustomer=cus_123,\nplan=monthly_pro\n($49/mo)\nbilling_anchor=1st of\nmonth\n\n2. Billing engine (runs\ndaily):\nSELECT\nsubscriptions\nWHERE\nnext_billing_date <=\nNOW()\nAND status =\n'active'\n\n3. For each due\nsubscription:\n→ Create payment\nintent ($49.00)\n→ Attempt charge on\nstored payment\nmethod\n→ If succeeds:\nadvance\nnext_billing_date by\n1 month\n→ If fails: enter\ndunning cycle\n\nDunning (failed\npayment recovery):\n\nProration (mid-cycle\nplan change):\nCustomer upgrades\nfrom $49 → $99 on\nday 15 of 30:\nUnused on old plan:\n$49 × (15/30) =\n$24.50 credit\nRemaining on new\nplan: $99 × (15/30)\n= $49.50 charge\nNet charge: $49.50\n- $24.50 = $25.00","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}