# A Compliance-Grade Invoice Still Had a Hardcoded 404 in It

> A payment can succeed and still leave a customer staring at a 404. ZopNight's Razorpay integration redirected every customer back to a fixed path after a successful payment, a path that assumes the…

Source: https://zop.dev/resources/blogs/a-hardcoded-payment-callback-was-404ing-on-prod-all-along
Published: 2026-09-30 · Author: riya-mittal · Tags: cloud-governance, billing, compliance

---

A payment can succeed and still leave a customer staring at a 404. ZopNight's Razorpay integration redirected every customer back to a fixed path after a successful payment, a path that assumes the application lives at the root of its own domain. Production doesn't work that way. The app actually runs nested under its own path, and the hard-coded redirect had no way of knowing that, so a customer who'd just paid landed on an error page instead of a confirmation.

## A Default That Matches the Old Behavior Exactly

The fix adds a nullable metadata column to [each tenant's payment settings](https://zop.dev/resources/blogs/self-serve-billing-needed-an-immutable-price-record), carrying a configurable callback path that defaults to the exact value that used to be hard-coded everywhere. That default is the detail that makes this safe to ship without touching every tenant at once: nothing changes in production behavior until someone deliberately sets a different path for a specific tenant.

<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIGRhdGEtZDItdmVyc2lvbj0iMC43LjEiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiIHZpZXdCb3g9IjAgMCA4NDcgNjAwIiB3aWR0aD0iODQ3IiBoZWlnaHQ9IjYwMCI+PHN2ZyBjbGFzcz0iZDItMjE1Mzk4ODAyMSBkMi1zdmciIHdpZHRoPSI4NDciIGhlaWdodD0iNjAwIiB2aWV3Qm94PSItMTAxIC0xMDEgODQ3IDYwMCI+PHJlY3QgeD0iLTEwMS4wMDAwMDAiIHk9Ii0xMDEuMDAwMDAwIiB3aWR0aD0iODQ3LjAwMDAwMCIgaGVpZ2h0PSI2MDAuMDAwMDAwIiByeD0iMC4wMDAwMDAiIGZpbGw9IiNGRkZGRkYiIGNsYXNzPSIgZmlsbC1ONyIgc3Ryb2tlLXdpZHRoPSIwIiAvPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PCFbQ0RBVEFbCi5kMi0yMTUzOTg4MDIxIC50ZXh0LWJvbGQgewoJZm9udC1mYW1pbHk6ICJkMi0yMTUzOTg4MDIxLWZvbnQtYm9sZCI7Cn0KQGZvbnQtZmFjZSB7Cglmb250LWZhbWlseTogZDItMjE1Mzk4ODAyMS1mb250LWJvbGQ7CglzcmM6IHVybCgiZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7YmFzZTY0LGQwOUdSZ0FCQUFBQUFBN2tBQW9BQUFBQUZxUUFBZ3VGQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUFV5OHlBQUFBOUFBQUFHQUFBQUJnWHhIWHJtTnRZWEFBQUFGVUFBQUFwQUFBQU5vRUN3Um9aMng1WmdBQUFmZ0FBQWhGQUFBTEZLMHQvVWxvWldGa0FBQUtRQUFBQURZQUFBQTJHMzhlMUdob1pXRUFBQXA0QUFBQUpBQUFBQ1FLZndYa2FHMTBlQUFBQ3B3QUFBQ1NBQUFBbEVoZ0JoQnNiMk5oQUFBTE1BQUFBRXdBQUFCTU04bzJpRzFoZUhBQUFBdDhBQUFBSUFBQUFDQUFQUUQzYm1GdFpRQUFDNXdBQUFNb0FBQUlLZ2p3VmtGd2IzTjBBQUFPeEFBQUFCMEFBQUFnLzlFQU1nQURBaW9DdkFBRkFBQUNpZ0pZQUFBQVN3S0tBbGdBQUFGZUFESUJLUUFBQWdzSEF3TUVBd0lDQkdBQUF2Y0FBQUFEQUFBQUFBQUFBQUJCUkVKUEFDQUFJUC8vQXU3L0JnQUFBOWdCRVNBQUFaOEFBQUFBQWZBQ2xBQUFBQ0FBQTNpY2ZNMDVMZ2NCQUVmaGI4emZQc2JZOXpFMEdvWENCVVNqRXNWY1FDa2FrWWc0a09VQUVvMkNDN2lEWHFKU0tYNFNyY1JyWC9HaFVDcFFHWGhEcTFHcWRYYnMyclB2d0tFakozcG5MbHk1U2ZqemovVk9uYnQwbmVROTMvbktaejd5bXBjODV5bVBlY2g5N25MN3EvMVhZZHVXVFowaHBZRmhJMGFOR1RkaFVtVktiVnBqeHF3NTh4WXNXckpzeGFvMTZ6YTAvQUFBQVAvL0FRQUEvLy9aenloYmVKeUVWbHRzSEdjVlB2Ky9zenZlOWZneU96c3plL0ZleHp1ejY4dmEzdG1MTDJ1djExNWZzNzV0NUV0YXgyNnQwcFk0Y1VLeUlXNUpXeVNhQXExREMrdUNRNkd0SWlwQmxWYXFDaElVREtJU0RWWHpscGErVU5FSUZKQVFhS2tzVktYMkxKcVpqZVBraFllWmZ4Nk96am5mZDc3dnpBOUdtQWJBSzNnVERHQ0dPckFDQ3lEVGZqb29TNUpBSnVWa1V1QU5TUW5SNURTMktxLzlSQW9UNFREUjVOdnlQcjY4akNhVzhPYmU4ZnNuVmxiK3U5elRvN3o4cTNlVWkrak1Pd0M0ZkFzQUQrSU5NQU1Od0pDeUpJcVNZRElaR0prUkpJRzhXZjljWFkycmhxQWN0NjY5ZGUxSG9hc2hOSjVLZGF6SnNSUEtCYnl4VjNqcEpRQUFCSkh5RG03SFcrQUNNQVpFTVI1TEpPUW94NU9pS0FSTUp0Ykd5ZEZFa2plaG8vbG5EODllektjZjhrODZra0xMV1BQY2FDaHRuOHhUdVJkUEhMODBJd2VXZUhkMGFlQ2hVNDJPeFFjQXdRUUFuc1ViVUszaWxWazVMdE1DTGRBVHhSdWJtemZ3eGhkZjdCVlF2VkxTZWxCamMzZ0RHQzJXNFdWUmpLdnhCa25nT0phZCtNSHIvUVJSdTZFZXhocThvZnptaGRqWHUyL3VGZERRZHhMbnUvOE9BRmpEOFNUZWdycDdrSENzeldTU29vbDRUQVhFMmpnMHQzRGgwS0VMQy9wN2NISnljSEJ5a3NwZk9yYjY0dFRVOTQ4ZHU1Ui9xckN5c3JhMnNsSlE4NnE5dGVNTm9NQ21kVmZKS0Fnc0xVZlZwTUxFcDZObmg0Y0xRek9qNi8ycExONlFGcWR5SzIyZm9QeWpjcFBPc1FNQU0zZ0RTRFdERVBlekFuM3RiWFRyYlZ4Ly92eWVTZ0ZnYUNydm9BL1JMamhBQU9BRGF2dEpiUWFrcE9GZ2FVR2RiekthU01hMXVmdzJPLzEwRVF0aGIzOWp2RzIxZS9uaGRRdmhIYWx5QkpuSmxKZWFUMDh1MVBrbE8vdWd1M0h0dFBJM3VVRTR6VFB6bG1hM25kZnFaY283bU1QYllBT3Z4cGNra0FJdHMrUTlwQWtCa3VVNE5PUWZkQlBVbVNMaHpnWlNDMjJwNVFVeE1kY1N0b1VvdnkrT3Q2L2tuTzYrcitSbUgwdXZEK2VlYWYzQVdxdmhiaXp2b0cyMEM4NTd0YVZQUWxlV0NUbUdUbVpHdjVxTmpEUU1DYjU0T3QxdWp6RGR3VG1xOTJ6K2NLSFh3eSs3YzVuK0NiYnVBWjlMNTBvcTc2QmR2QTBNK0c1enBTV1dWTkhzc3lSV3lueTJlTEpuT1JidWRKaUs2eGJDT1l6dGtwVnB0Z21KTnVxNXgyYk85alhZY3ovYkcreHdDdXMyeHdmVzJzR1JzU0hBV3U4MzBDN1lLL3djMUJQcDV6ZzVxdlp1a0RWWkllL0k2WUhCNHowalI5c0lySHhzR2U2SUp6ckVwUisrTGJVRUVsUmZJVDlUU0tkWHMwelFuSkQ5UjV3ZTFCMk90K25hc0FPZ0FuNWZQVlZ0Sk84MklNdktyRURmTnpEUU9EM29qZFc3YXB5VXkzUGtDSHJpaE5FVm40dFJwdU5HbzEvMG5GRytBV0NBUUxrVmsyZ1gycUFIeGpWbXhIaE1KVUlWVS93MkJGNW1oWXFJQTVJMkIxVmVOcFBKY01BbGpQNHRCRVF0NUxQdXBjNFJ4dVd6TzhQZFMvRVcveSttU0hOc0llbjJXZ1BoNmNVSHMrZkgzWkxrZGt0U09Ob3ZCV1dIbjNMMVhuZDJ0cVJDUkUzSTY0cldFOVpzYzJvcVJLMVdCMnhkNDQyV09vNng5Z3pLTXhIMGZsTllDb2RDNFNhbDJPamc2dzBHdTZQQnJYT1RVWWV0YVZUYkllUnRJOUJhbHlTZEtaSU5oNkl6WTBXM3J5Rmt4OXRYamppYVY0OHExNUEvRVhMd3lsdFFMa01TQUQ3QjE3R28rZ3BJYUlSbjkzTjc4RFpRV201YVRzb2tJMGdrbTNtZStQR3JiLzc2bFZOcHZLMnMvZUdhOHVmZmp6eXV4cGQza0JWdlE1MnVPRnFtOXdYOHgxeFBrVFliU1pPVkNsTDNIOExDM3NlOEZhRVRSbEt2WTNDalhmQnJkWGhabis1ZFNNajlNNk42ZUxnam5tSDg0eDNUaDRwdVg3QmRmYldoVXIrM3RUa1U2TGdOcjExNXEzTGM1Z250Vm5pcTFEakkwN3FGOEUzc0U0VkthVS9yWFR6cGV0ZTA4Ly8zSjVjK21jMmVUS2ZYc3RtMWRHc2swaHBwYmExNHRiZHdPSCsyOTl4RWZ5YW5XbGJmTTZPWVE3dkFnQWVBdjlPZEpqOVI0bG5tenBwUiszU1BTZmM5bWxwTytGSk80NVNZbUd0dXNvVitpWC9hNFJTK2ZXWjJQZTF5VEgwWE5lNHZHUTA3ZWg3dGd2VXVmblgzNk1oZE9aRnRzTmhySFBVTnZUWlVtbzkyR0kxUEVVUTRxbndLQ05qeURub0Y3WUtrelZWS3FzNVd3WXBTQk1kamQ1S3hObzczWU5abXV0N3hpRGdRU0h2OUhuZkU2ZWtKZlhtMmE5NDc0SXc1dTdwRVgyLzRVVXIwTGpwY1BFTnpqSVZxN0FvUHpVbjJCUnNuMlIyMTFVSlhaUENvcm0yNnZJUFdjQUY0amUxNFhJZ25rN0xxOWdPTEVSYW5zam42OFhQbkJEZmxzUEJNa2pvMjkvNEowOU5QbjduYUZEUVJxeVpLejVVcTc2RFBVVW1kLzEzYXBDdnI4RTh6WTBXUHIwSGtpdXZWQnU4NHRYb1V4WlMveE1OT054cFY2b2VDTGZvZXdpVlUwblJxa0htT1U2bE1KZzk4R1lUS0hZTWtOODkvcjkxa01SRmtqVG41VktlNWppUklNOW4yclhOWFdza2FraUNyeVJaVXVoa2NGY1Z4NGFaMmpnWnZLdlh2Q2NPaDBMRHdudGF6T3J3ZFZGTC9qVElqSFNoRDhuZnExRzQ5LzNLTGhiTVFWZGFxd05ZTGwxNXVwM2lLTU52TUVzTC9ubWFiV2JhWm5TNy9KOCsyc0d3emwxZnpVdVUrdElkS3FvcnZ6RE9aUEFqSlVJdlhPWCtkazdSV0JVTVc4bmViSTlWV0MxRkZtMU1Yci9DZFUrK2FpRlBJMk9oMm9yOStGQmdPQ2lQQ1IwcDEzMnlUL3U4SmxuZlFQL0Uzb2JyaUUxMGpyRTMxaUthYnlyV0pRMVVQUC9IRXcrcmpDUEY4eUdFUDJlMGg2dlhMbDE5NzdmTGwxMDhIbCtibkZ3T0J4Zm41cGFDYWx3RkFuK092Z1ZtZElpT3JHMXVsZ0luNzQ0eTYvQVQyMVdlTWlLQ2N0VkhsWC8vNCtkZ1lxbnJFTytOeEpseksydGFYMEpQS3hWTmIrbjJ1RHdHOG9mcUJseElKS1JBUURqU1o4M1IySTB4Z0laRVFvN0hGZHlkdG1XQnpTSXlNWi9McnVwWnlhQVUreFcrQ0VZQ1JKSmtrMTl6R1RhTWJyVnk5Y09HcTdqZjRFSlhBb08vTlRCR1ZsSHBBNVRkd0Z4ekcxOVg3SG4yZ1lEQVNDUVlqRWR6VkpBaE42Z1AvQXdBQS8vOEJBQUQvL3dSc1VINEFBQUFBQVFBQUFBSUxoUzYxQnQ5ZkR6ejFBQUVENkFBQUFBRFlYYUNFQUFBQUFOMW1MemIrTi83RUNHMEQ4UUFCQUFNQUFnQUFBQUFBQUFBQkFBQUQyUDd2QUFBSW1QNDMvamNJYlFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBSlhpY0hNcXhyc0ZnR01ieC8vczBPVGtTb2FLa0ZvTlVKRFJkU2ZRYjNzWGtTd3dNcnNZZDJLMW1GcXNic0xzYlN5WDJueDdzZUlGQzg5R0dTbGVpTGtUZHFMUW5xbVNrTG5NRjNONFVDc3owUjJFSGNnMlphSTFieGxJRmJtTThPZUtxY1MxKzF1Mk0yNU9CbmVocFJaMzhrMHQwMUtLdGxLbFMrbFpTV2NuV01oeWEreGNBQVAvL0FRQUEvLy9jckJTckFBQUFBQUFzQUN3QVVBQjhBSklBdEFEZ0FRSUJGQUZNQVg0QnFnSGNBaEFDTmdLZUFzQUN6QUxrQXdBRE1nTlVBNEFEc0FQUUJBd0VNZ1JVQkl3RXVBVG9CUlFGT0FWWUJXZ0ZkQVdLQUFFQUFBQWxBSkFBREFCakFBY0FBUUFBQUFBQUFBQUFBQUFBQUFBRUFBTjRuSnlVejI0YlZSVEdmMDVzMHdyQkFrVlZ1b251Z2tXUjZOaFVTZFUySzRmVWlrVVVCNDhMUWtKSUU4LzRqektlR1hrbUR1RUpXUE1XdkVWWFBBVFBnVmlqK1h6czJBWFJKb3FTZkhmdStmT2RjNzV6Z1IzK1pwdEs5U0h3UnoweFhHR3ZmbTU0aXdmMUU4UGJ0T3RiaHFzOHFmMXB1RVpZbXh1dTgzbXRaL2dqM2xaL00veUEvZXBQaGgreVcyMGIvcGhuMVIzRG4ydzcvakw4S2Z1OFhlQUt2T0JYd3hWMnlReHZzY09QaHJkNWhNV3NWSGxFMDNDTno5Z3pYR2NQNkRPaElHWkN3Z2pIa0FranJwZ1JrZU1UTVdQQ2tJZ1FSNGNXTVlXK0pnUkNqdEYvZmczd0taZ1JLT0tZQWtlTVQweEF6dGdpL2lLdmxITmxIT28wczdzV0JXTUNMdVJ4U1VDQ0kyVkVTa0xFcGVJVUZHUzhva0dEbklINFpoVGtlT1JNaVBGSW1UR2lRWmMycC9RWk15SEgwVmFra3BsUHlwQ0Nhd0xsZDJaUmRtWkFSRUp1cks1SUNNWFRpVjhrN3c2bk9McGtzbDJQZkxvUjRVc2MzOG03NUpiSzlpczgvYm8xWnB0NWwyd0M1dXBucks3RXVybldCTWU2TGZPMitGYTQ0Qlh1WHYzWlpQTCtIb1g2WHlqeUJWZWFmNmhKSldLUzROd3VMWHdweUhlUGNSenAzTUZYUjc2blE1OFR1cnlocjNPTEhqMWFuTkdudzJ2NWR1bmgrSm91Wnh6TG95Tzh1R3RMTVdmOGdPTWJPcklwWTBmV244WEVJbjRtTTNYbjRqaFRIVk15OWJ4azdxbldTQlhlZmNMbERxVWI2c2psTTlBZWxaWk84MHUwWndFalUwVW1obFAxY3FtTjNQb1htaUttcXFXYzdlMTl1UTF6MjczbEZ0K1Fhb2RMdFM0NGxaTmJNSHJmVkwxM05IT3RINCtBa0pRTFdReEltZEtnNEVhOHp3bTRJc1p4ck82ZGFFc0tXaXVmTXMrTlZCSXhGWU1PaWVMTXlQUTNNTjM0eG4yd29YdG5iMGtvLzVMcDVhcXErMlJ4NnRYdGpONm9lOHM3MzdvY3JVMmdZVk5OMTlRMEVOZkV0QjlwcDliNSsvTE45YnFsUE9XSWxKandYeS9BTXp5YTdIUEFJV05sR09obWJxOURVeTlFazVjY3F2cExJbGtOcGVmSUloemc4WndERG5qSjgzZjZ1R1Rpakl0YmNWblAzZUtZSTdvY2ZsQVZDL3N1Ujd4ZWZmdi9yTCtMYVZPMU9KNnVUaS91UGNVbmQxRHJGOXF6Mi9leXA0bVZrNWhidE51dE9DTmdXbkp4dStzMXVjZDQvd0FBQVAvL0FRQUEvLy8wdDA5UmVKeGlZR1lBZy8vbkdJd1lzQUFBQUFBQS8vOEJBQUQvL3k4QkFnTUFBQUE9Iik7Cn1dXT48L3N0eWxlPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PCFbQ0RBVEFbLnNoYXBlIHsKICBzaGFwZS1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Ci5jb25uZWN0aW9uIHsKICBzdHJva2UtbGluZWNhcDogcm91bmQ7CiAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKfQouYmxlbmQgewogIG1peC1ibGVuZC1tb2RlOiBtdWx0aXBseTsKICBvcGFjaXR5OiAwLjU7Cn0KCgkJLmQyLTIxNTM5ODgwMjEgLmZpbGwtTjF7ZmlsbDojMEEwRjI1O30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1OMntmaWxsOiM2NzZDN0U7fQoJCS5kMi0yMTUzOTg4MDIxIC5maWxsLU4ze2ZpbGw6Izk0OTlBQjt9CgkJLmQyLTIxNTM5ODgwMjEgLmZpbGwtTjR7ZmlsbDojQ0ZEMkREO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1ONXtmaWxsOiNERUUxRUI7fQoJCS5kMi0yMTUzOTg4MDIxIC5maWxsLU42e2ZpbGw6I0VFRjFGODt9CgkJLmQyLTIxNTM5ODgwMjEgLmZpbGwtTjd7ZmlsbDojRkZGRkZGO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1CMXtmaWxsOiMwRDMyQjI7fQoJCS5kMi0yMTUzOTg4MDIxIC5maWxsLUIye2ZpbGw6IzBEMzJCMjt9CgkJLmQyLTIxNTM5ODgwMjEgLmZpbGwtQjN7ZmlsbDojRTNFOUZEO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1CNHtmaWxsOiNFM0U5RkQ7fQoJCS5kMi0yMTUzOTg4MDIxIC5maWxsLUI1e2ZpbGw6I0VERjBGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLmZpbGwtQjZ7ZmlsbDojRjdGOEZFO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1BQTJ7ZmlsbDojNEE2RkYzO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1BQTR7ZmlsbDojRURGMEZEO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1BQTV7ZmlsbDojRjdGOEZFO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1BQjR7ZmlsbDojRURGMEZEO30KCQkuZDItMjE1Mzk4ODAyMSAuZmlsbC1BQjV7ZmlsbDojRjdGOEZFO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU4xe3N0cm9rZTojMEEwRjI1O30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU4ye3N0cm9rZTojNjc2QzdFO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU4ze3N0cm9rZTojOTQ5OUFCO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU40e3N0cm9rZTojQ0ZEMkREO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU41e3N0cm9rZTojREVFMUVCO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU42e3N0cm9rZTojRUVGMUY4O30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLU43e3N0cm9rZTojRkZGRkZGO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUIxe3N0cm9rZTojMEQzMkIyO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUIye3N0cm9rZTojMEQzMkIyO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUIze3N0cm9rZTojRTNFOUZEO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUI0e3N0cm9rZTojRTNFOUZEO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUI1e3N0cm9rZTojRURGMEZEO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUI2e3N0cm9rZTojRjdGOEZFO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUFBMntzdHJva2U6IzRBNkZGMzt9CgkJLmQyLTIxNTM5ODgwMjEgLnN0cm9rZS1BQTR7c3Ryb2tlOiNFREYwRkQ7fQoJCS5kMi0yMTUzOTg4MDIxIC5zdHJva2UtQUE1e3N0cm9rZTojRjdGOEZFO30KCQkuZDItMjE1Mzk4ODAyMSAuc3Ryb2tlLUFCNHtzdHJva2U6I0VERjBGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLnN0cm9rZS1BQjV7c3Ryb2tlOiNGN0Y4RkU7fQoJCS5kMi0yMTUzOTg4MDIxIC5iYWNrZ3JvdW5kLWNvbG9yLU4xe2JhY2tncm91bmQtY29sb3I6IzBBMEYyNTt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItTjJ7YmFja2dyb3VuZC1jb2xvcjojNjc2QzdFO30KCQkuZDItMjE1Mzk4ODAyMSAuYmFja2dyb3VuZC1jb2xvci1OM3tiYWNrZ3JvdW5kLWNvbG9yOiM5NDk5QUI7fQoJCS5kMi0yMTUzOTg4MDIxIC5iYWNrZ3JvdW5kLWNvbG9yLU40e2JhY2tncm91bmQtY29sb3I6I0NGRDJERDt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItTjV7YmFja2dyb3VuZC1jb2xvcjojREVFMUVCO30KCQkuZDItMjE1Mzk4ODAyMSAuYmFja2dyb3VuZC1jb2xvci1ONntiYWNrZ3JvdW5kLWNvbG9yOiNFRUYxRjg7fQoJCS5kMi0yMTUzOTg4MDIxIC5iYWNrZ3JvdW5kLWNvbG9yLU43e2JhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQjF7YmFja2dyb3VuZC1jb2xvcjojMEQzMkIyO30KCQkuZDItMjE1Mzk4ODAyMSAuYmFja2dyb3VuZC1jb2xvci1CMntiYWNrZ3JvdW5kLWNvbG9yOiMwRDMyQjI7fQoJCS5kMi0yMTUzOTg4MDIxIC5iYWNrZ3JvdW5kLWNvbG9yLUIze2JhY2tncm91bmQtY29sb3I6I0UzRTlGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQjR7YmFja2dyb3VuZC1jb2xvcjojRTNFOUZEO30KCQkuZDItMjE1Mzk4ODAyMSAuYmFja2dyb3VuZC1jb2xvci1CNXtiYWNrZ3JvdW5kLWNvbG9yOiNFREYwRkQ7fQoJCS5kMi0yMTUzOTg4MDIxIC5iYWNrZ3JvdW5kLWNvbG9yLUI2e2JhY2tncm91bmQtY29sb3I6I0Y3RjhGRTt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQUEye2JhY2tncm91bmQtY29sb3I6IzRBNkZGMzt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQUE0e2JhY2tncm91bmQtY29sb3I6I0VERjBGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQUE1e2JhY2tncm91bmQtY29sb3I6I0Y3RjhGRTt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQUI0e2JhY2tncm91bmQtY29sb3I6I0VERjBGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLmJhY2tncm91bmQtY29sb3ItQUI1e2JhY2tncm91bmQtY29sb3I6I0Y3RjhGRTt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLU4xe2NvbG9yOiMwQTBGMjU7fQoJCS5kMi0yMTUzOTg4MDIxIC5jb2xvci1OMntjb2xvcjojNjc2QzdFO30KCQkuZDItMjE1Mzk4ODAyMSAuY29sb3ItTjN7Y29sb3I6Izk0OTlBQjt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLU40e2NvbG9yOiNDRkQyREQ7fQoJCS5kMi0yMTUzOTg4MDIxIC5jb2xvci1ONXtjb2xvcjojREVFMUVCO30KCQkuZDItMjE1Mzk4ODAyMSAuY29sb3ItTjZ7Y29sb3I6I0VFRjFGODt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLU43e2NvbG9yOiNGRkZGRkY7fQoJCS5kMi0yMTUzOTg4MDIxIC5jb2xvci1CMXtjb2xvcjojMEQzMkIyO30KCQkuZDItMjE1Mzk4ODAyMSAuY29sb3ItQjJ7Y29sb3I6IzBEMzJCMjt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLUIze2NvbG9yOiNFM0U5RkQ7fQoJCS5kMi0yMTUzOTg4MDIxIC5jb2xvci1CNHtjb2xvcjojRTNFOUZEO30KCQkuZDItMjE1Mzk4ODAyMSAuY29sb3ItQjV7Y29sb3I6I0VERjBGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLUI2e2NvbG9yOiNGN0Y4RkU7fQoJCS5kMi0yMTUzOTg4MDIxIC5jb2xvci1BQTJ7Y29sb3I6IzRBNkZGMzt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLUFBNHtjb2xvcjojRURGMEZEO30KCQkuZDItMjE1Mzk4ODAyMSAuY29sb3ItQUE1e2NvbG9yOiNGN0Y4RkU7fQoJCS5kMi0yMTUzOTg4MDIxIC5jb2xvci1BQjR7Y29sb3I6I0VERjBGRDt9CgkJLmQyLTIxNTM5ODgwMjEgLmNvbG9yLUFCNXtjb2xvcjojRjdGOEZFO30uYXBwZW5kaXggdGV4dC50ZXh0e2ZpbGw6IzBBMEYyNX0ubWR7LS1jb2xvci1mZy1kZWZhdWx0OiMwQTBGMjU7LS1jb2xvci1mZy1tdXRlZDojNjc2QzdFOy0tY29sb3ItZmctc3VidGxlOiM5NDk5QUI7LS1jb2xvci1jYW52YXMtZGVmYXVsdDojRkZGRkZGOy0tY29sb3ItY2FudmFzLXN1YnRsZTojRUVGMUY4Oy0tY29sb3ItYm9yZGVyLWRlZmF1bHQ6IzBEMzJCMjstLWNvbG9yLWJvcmRlci1tdXRlZDojMEQzMkIyOy0tY29sb3ItbmV1dHJhbC1tdXRlZDojRUVGMUY4Oy0tY29sb3ItYWNjZW50LWZnOiMwRDMyQjI7LS1jb2xvci1hY2NlbnQtZW1waGFzaXM6IzBEMzJCMjstLWNvbG9yLWF0dGVudGlvbi1zdWJ0bGU6IzY3NkM3RTstLWNvbG9yLWRhbmdlci1mZzpyZWQ7fS5za2V0Y2gtb3ZlcmxheS1CMXtmaWxsOnVybCgjc3RyZWFrcy1kYXJrZXItZDItMjE1Mzk4ODAyMSk7bWl4LWJsZW5kLW1vZGU6bGlnaHRlbn0uc2tldGNoLW92ZXJsYXktQjJ7ZmlsbDp1cmwoI3N0cmVha3MtZGFya2VyLWQyLTIxNTM5ODgwMjEpO21peC1ibGVuZC1tb2RlOmxpZ2h0ZW59LnNrZXRjaC1vdmVybGF5LUIze2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUI0e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUI1e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUI2e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUFBMntmaWxsOnVybCgjc3RyZWFrcy1kYXJrLWQyLTIxNTM5ODgwMjEpO21peC1ibGVuZC1tb2RlOm92ZXJsYXl9LnNrZXRjaC1vdmVybGF5LUFBNHtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMjE1Mzk4ODAyMSk7bWl4LWJsZW5kLW1vZGU6ZGFya2VufS5za2V0Y2gtb3ZlcmxheS1BQTV7ZmlsbDp1cmwoI3N0cmVha3MtYnJpZ2h0LWQyLTIxNTM5ODgwMjEpO21peC1ibGVuZC1tb2RlOmRhcmtlbn0uc2tldGNoLW92ZXJsYXktQUI0e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LUFCNXtmaWxsOnVybCgjc3RyZWFrcy1icmlnaHQtZDItMjE1Mzk4ODAyMSk7bWl4LWJsZW5kLW1vZGU6ZGFya2VufS5za2V0Y2gtb3ZlcmxheS1OMXtmaWxsOnVybCgjc3RyZWFrcy1kYXJrZXItZDItMjE1Mzk4ODAyMSk7bWl4LWJsZW5kLW1vZGU6bGlnaHRlbn0uc2tldGNoLW92ZXJsYXktTjJ7ZmlsbDp1cmwoI3N0cmVha3MtZGFyay1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpvdmVybGF5fS5za2V0Y2gtb3ZlcmxheS1OM3tmaWxsOnVybCgjc3RyZWFrcy1ub3JtYWwtZDItMjE1Mzk4ODAyMSk7bWl4LWJsZW5kLW1vZGU6Y29sb3ItYnVybn0uc2tldGNoLW92ZXJsYXktTjR7ZmlsbDp1cmwoI3N0cmVha3Mtbm9ybWFsLWQyLTIxNTM5ODgwMjEpO21peC1ibGVuZC1tb2RlOmNvbG9yLWJ1cm59LnNrZXRjaC1vdmVybGF5LU41e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LU42e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LnNrZXRjaC1vdmVybGF5LU43e2ZpbGw6dXJsKCNzdHJlYWtzLWJyaWdodC1kMi0yMTUzOTg4MDIxKTttaXgtYmxlbmQtbW9kZTpkYXJrZW59LmxpZ2h0LWNvZGV7ZGlzcGxheTogYmxvY2t9LmRhcmstY29kZXtkaXNwbGF5OiBub25lfV1dPjwvc3R5bGU+PGcgY2xhc3M9ImIyeGsiPjxnIGNsYXNzPSJzaGFwZSIgPjxyZWN0IHg9IjEzLjAwMDAwMCIgeT0iMC4wMDAwMDAiIHdpZHRoPSIyNDUuMDAwMDAwIiBoZWlnaHQ9IjY2LjAwMDAwMCIgc3Ryb2tlPSIjMEQzMkIyIiBmaWxsPSIjRjdGOEZFIiBjbGFzcz0iIHN0cm9rZS1CMSBmaWxsLUI2IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjI7IiAvPjwvZz48dGV4dCB4PSIxMzUuNTAwMDAwIiB5PSIzOC41MDAwMDAiIGZpbGw9IiMwQTBGMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+T2xkIGhhcmRjb2RlZCByZWRpcmVjdCBwYXRoPC90ZXh0PjwvZz48ZyBjbGFzcz0iY0hKdlpBPT0iPjxnIGNsYXNzPSJzaGFwZSIgPjxyZWN0IHg9IjAuMDAwMDAwIiB5PSIxNjYuMDAwMDAwIiB3aWR0aD0iMjcwLjAwMDAwMCIgaGVpZ2h0PSI2Ni4wMDAwMDAiIHN0cm9rZT0iIzBEMzJCMiIgZmlsbD0iI0Y3RjhGRSIgY2xhc3M9IiBzdHJva2UtQjEgZmlsbC1CNiIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgLz48L2c+PHRleHQgeD0iMTM1LjAwMDAwMCIgeT0iMjA0LjUwMDAwMCIgZmlsbD0iIzBBMEYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij40MDQgb24gcHJvZCwgd3JvbmcgbmVzdGVkIHBhdGg8L3RleHQ+PC9nPjxnIGNsYXNzPSJZMjlzZFcxdSI+PGcgY2xhc3M9InNoYXBlIiA+PHJlY3QgeD0iMzE4LjAwMDAwMCIgeT0iMC4wMDAwMDAiIHdpZHRoPSIzMjcuMDAwMDAwIiBoZWlnaHQ9IjY2LjAwMDAwMCIgc3Ryb2tlPSIjMEQzMkIyIiBmaWxsPSIjRjdGOEZFIiBjbGFzcz0iIHN0cm9rZS1CMSBmaWxsLUI2IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjI7IiAvPjwvZz48dGV4dCB4PSI0ODEuNTAwMDAwIiB5PSIzOC41MDAwMDAiIGZpbGw9IiMwQTBGMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+TmV3IGNhbGxiYWNrUGF0aCBjb2x1bW4sIHNhbWUgZGVmYXVsdDwvdGV4dD48L2c+PGcgY2xhc3M9ImNHRjBZMmc9Ij48ZyBjbGFzcz0ic2hhcGUiID48cmVjdCB4PSIzNDguMDAwMDAwIiB5PSIxNjYuMDAwMDAwIiB3aWR0aD0iMjY2LjAwMDAwMCIgaGVpZ2h0PSI2Ni4wMDAwMDAiIHN0cm9rZT0iIzBEMzJCMiIgZmlsbD0iI0Y3RjhGRSIgY2xhc3M9IiBzdHJva2UtQjEgZmlsbC1CNiIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgLz48L2c+PHRleHQgeD0iNDgxLjAwMDAwMCIgeT0iMjA0LjUwMDAwMCIgZmlsbD0iIzBBMEYyNSIgY2xhc3M9InRleHQtYm9sZCBmaWxsLU4xIiBzdHlsZT0idGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxNnB4Ij5QQVRDSCBlZGl0cyBob3N0IGFuZCBwYXRoIG9ubHk8L3RleHQ+PC9nPjxnIGNsYXNzPSJabWw0WldRPSI+PGcgY2xhc3M9InNoYXBlIiA+PHJlY3QgeD0iMzQ3LjAwMDAwMCIgeT0iMzMyLjAwMDAwMCIgd2lkdGg9IjI2OS4wMDAwMDAiIGhlaWdodD0iNjYuMDAwMDAwIiBzdHJva2U9IiMwRDMyQjIiIGZpbGw9IiNGN0Y4RkUiIGNsYXNzPSIgc3Ryb2tlLUIxIGZpbGwtQjYiIHN0eWxlPSJzdHJva2Utd2lkdGg6MjsiIC8+PC9nPjx0ZXh0IHg9IjQ4MS41MDAwMDAiIHk9IjM3MC41MDAwMDAiIGZpbGw9IiMwQTBGMjUiIGNsYXNzPSJ0ZXh0LWJvbGQgZmlsbC1OMSIgc3R5bGU9InRleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MTZweCI+VGVuYW50JiMzOTtzIHJlYWwgcGF0aCBzZXQgZXhwbGljaXRseTwvdGV4dD48L2c+PGcgY2xhc3M9IktHOXNaQ0F0Sm1kME95QndjbTlrS1Zzd1hRPT0iPjxtYXJrZXIgaWQ9Im1rLWQyLTIxNTM5ODgwMjEtMzQ4ODM3ODEzNCIgbWFya2VyV2lkdGg9IjEwLjAwMDAwMCIgbWFya2VySGVpZ2h0PSIxMi4wMDAwMDAiIHJlZlg9IjcuMDAwMDAwIiByZWZZPSI2LjAwMDAwMCIgdmlld0JveD0iMC4wMDAwMDAgMC4wMDAwMDAgMTAuMDAwMDAwIDEyLjAwMDAwMCIgb3JpZW50PSJhdXRvIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiPiA8cG9seWdvbiBwb2ludHM9IjAuMDAwMDAwLDAuMDAwMDAwIDEwLjAwMDAwMCw2LjAwMDAwMCAwLjAwMDAwMCwxMi4wMDAwMDAiIGZpbGw9IiMwRDMyQjIiIGNsYXNzPSJjb25uZWN0aW9uIGZpbGwtQjEiIHN0cm9rZS13aWR0aD0iMiIgLz4gPC9tYXJrZXI+PHBhdGggZD0iTSAxMzUuMDAwMDAwIDY4LjAwMDAwMCBDIDEzNS4wMDAwMDAgMTA2LjAwMDAwMCAxMzUuMDAwMDAwIDEyNi4wMDAwMDAgMTM1LjAwMDAwMCAxNjIuMDAwMDAwIiBzdHJva2U9IiMwRDMyQjIiIGZpbGw9Im5vbmUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0yMTUzOTg4MDIxLTM0ODgzNzgxMzQpIiBtYXNrPSJ1cmwoI2QyLTIxNTM5ODgwMjEpIiAvPjwvZz48ZyBjbGFzcz0iS0dOdmJIVnRiaUF0Sm1kME95QndZWFJqYUNsYk1GMD0iPjxwYXRoIGQ9Ik0gNDgxLjAwMDAwMCA2OC4wMDAwMDAgQyA0ODEuMDAwMDAwIDEwNi4wMDAwMDAgNDgxLjAwMDAwMCAxMjYuMDAwMDAwIDQ4MS4wMDAwMDAgMTYyLjAwMDAwMCIgc3Ryb2tlPSIjMEQzMkIyIiBmaWxsPSJub25lIiBjbGFzcz0iY29ubmVjdGlvbiBzdHJva2UtQjEiIHN0eWxlPSJzdHJva2Utd2lkdGg6MjsiIG1hcmtlci1lbmQ9InVybCgjbWstZDItMjE1Mzk4ODAyMS0zNDg4Mzc4MTM0KSIgbWFzaz0idXJsKCNkMi0yMTUzOTg4MDIxKSIgLz48L2c+PGcgY2xhc3M9IktIQmhkR05vSUMwbVozUTdJR1pwZUdWa0tWc3dYUT09Ij48cGF0aCBkPSJNIDQ4MS4wMDAwMDAgMjM0LjAwMDAwMCBDIDQ4MS4wMDAwMDAgMjcyLjAwMDAwMCA0ODEuMDAwMDAwIDI5Mi4wMDAwMDAgNDgxLjAwMDAwMCAzMjguMDAwMDAwIiBzdHJva2U9IiMwRDMyQjIiIGZpbGw9Im5vbmUiIGNsYXNzPSJjb25uZWN0aW9uIHN0cm9rZS1CMSIgc3R5bGU9InN0cm9rZS13aWR0aDoyOyIgbWFya2VyLWVuZD0idXJsKCNtay1kMi0yMTUzOTg4MDIxLTM0ODgzNzgxMzQpIiBtYXNrPSJ1cmwoI2QyLTIxNTM5ODgwMjEpIiAvPjwvZz48bWFzayBpZD0iZDItMjE1Mzk4ODAyMSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iLTEwMSIgeT0iLTEwMSIgd2lkdGg9Ijg0NyIgaGVpZ2h0PSI2MDAiPgo8cmVjdCB4PSItMTAxIiB5PSItMTAxIiB3aWR0aD0iODQ3IiBoZWlnaHQ9IjYwMCIgZmlsbD0id2hpdGUiPjwvcmVjdD4KCjwvbWFzaz48L3N2Zz48L3N2Zz4K" alt="Architecture diagram" style={{maxWidth:"100%",height:"auto",display:"block",margin:"2em auto"}} />

A new internal PATCH endpoint touches only the host and the callback path for one tenant's settings, while the existing full-replace PUT endpoint was changed to explicitly preserve whatever metadata is already stored whenever a caller doesn't include it, rather than silently erasing it the way a naive full replace normally would. The internal Payments page itself was split into two distinct sections, merchant credentials in one place and payment settings in another, since they're genuinely different kinds of configuration that had been living together under one confusing screen.

## Fixing the Code Doesn't Fix Already-Sent Links

Shipping this fix isn't the end of the story, because the migration only adds the capability to configure a correct path. It doesn't retroactively repair the value already stored for the one tenant that matters most. Someone still has to go into the new Edit settings screen, or call the PATCH endpoint directly, and set that tenant's callback path to the actual, real application path, by hand, after deploy.

Payment links generated and sent out before that manual step keep pointing at their original, broken path permanently. A fix to the code going forward has no effect on a URL a customer already has sitting in their inbox. Only newly generated links, created after the tenant's setting is corrected, actually benefit from the fix at all.

## An Invoice Rewritten to Be Read by a Person

Alongside the redirect fix, roughly 30 separate pieces of invoice and credit-note copy were rewritten in plain language. Each invoice displays a per-cloud-account activity column, one clear calculation trail from raw cloud usage down to the final total, and a [bill-to card that keeps GSTIN](https://zop.dev/resources/blogs/soc-2-compliance-on-cloud-infrastructure-a-technical-checklist-for-engineering-teams), place of supply, email, and phone grouped together instead of scattered. A credit note opens as its own page, showing the refund and exactly where it applied, and the two documents stack with a direct way to step backward and forward between a credit note and the invoice it relates to, plus deep links that open either one directly.

| What changed | Why it matters |
|---|---|
| ~30 strings rewritten in plain language | A customer reads an invoice without needing to decode internal terminology |
| Per-account activity column | Spend is traceable to the specific cloud account that generated it |
| Bill-to card with tax details grouped | Finance teams don't have to hunt across the page for compliance fields |
| Stacked drawers with deep links | A credit note and its invoice can be compared directly, not reconstructed from memory |

## A PDF That Matches What You Already Saw

Downloaded PDFs now render from the identical components as the on-screen drawer, forced into light theme regardless of whatever theme the viewer actually has set, so a PDF never reads as a different document than the one a customer was just looking at on screen. Files are named after their actual invoice or credit note number instead of a generic filename, and every PDF carries a direct Pay now link. The invoice-issued notification email's own underlying data now carries that same payment link directly, rather than requiring a customer to dig through the product to find a way to pay.

## Two Smaller Fixes Riding the Same Release

A [related webhook fix](https://zop.dev/resources/blogs/choosing-your-cost-source-meant-never-showing-a-fake-zero) carved out an explicit exception in the signature verification logic for a pair of Razorpay event types that arrive as siblings describing the same underlying payment, which had previously been refused outright as if they were duplicate or invalid events. Receivable-type invoices were also explicitly excluded from the dunning process entirely, since dunning exists to chase down unpaid, payable invoices, and a receivable was never the kind of document that logic was meant to act on in the first place. Both fixes are small on their own. Shipped in the same release as a redirect bug and a full invoice rewrite, they're a reminder that a billing system builds credibility one correctly handled edge case at a time, not in one single sweeping release.
