-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.html
More file actions
334 lines (303 loc) · 14.1 KB
/
Copy pathindex.html
File metadata and controls
334 lines (303 loc) · 14.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta name="generator" content="Hugo 0.147.8"><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>Margins and Throughput</title>
<meta name="description" content="A collection of my thoughts and experiences">
<meta name="author" content="M. Utku Altinkaya">
<link rel="canonical" href="/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.65c6102b96a2f43855b3b5347b7909dba711dec4cc692de8c21343c7b7913950.css" integrity="sha256-ZcYQK5ai9DhVs7U0e3kJ26cR3sTMaS3owhNDx7eROVA=" rel="preload stylesheet" as="style">
<link rel="icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" type="application/rss+xml" href="/index.xml">
<link rel="alternate" type="application/json" href="/index.json">
<link rel="alternate" hreflang="en" href="/">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
</noscript>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
<script>
MathJax = {
startup: {
ready() {
MathJax.startup.defaultReady();
MathJax.startup.document.inputJax[0].preFilters.add(({math}) => {
if (math.math.match(/\\\\/)) {
math.math = `\\displaylines{${math.math}}`;
}
});
}
},
tex: {
displayMath: [['\\[', '\\]'], ['$$', '$$']],
inlineMath: [['\\(', '\\)']]
},
loader:{
load: ['ui/safe']
},
};
</script>
<meta property="og:url" content="/">
<meta property="og:site_name" content="Margins and Throughput">
<meta property="og:title" content="Margins and Throughput">
<meta property="og:description" content="A collection of my thoughts and experiences">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Margins and Throughput">
<meta name="twitter:description" content="A collection of my thoughts and experiences">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Margins and Throughput",
"url": "/",
"description": "A collection of my thoughts and experiences",
"logo": "/favicon.ico",
"sameAs": [
]
}
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-EXK9ZJ4ET6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-EXK9ZJ4ET6');
</script>
</head>
<body class=" list dark" id="
top">
<script>
if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
}
</script>
<header class="header">
<nav class="nav">
<div class="logo">
<a href="/" accesskey="h" title="Margins and Throughput (Alt + H)">Margins and Throughput</a>
<div class="logo-switches">
<button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</button>
</div>
</div>
<ul id="menu">
<li>
<a href="/" title="Home">
<span class="active">Home</span>
</a>
</li>
<li>
<a href="/tags/cto-journal/" title="Technology">
<span>Technology</span>
</a>
</li>
<li>
<a href="/search" title="Search (Alt + /)" accesskey=/>
<span>Search</span>
</a>
</li>
<li>
<a href="/tags" title="Tags">
<span>Tags</span>
</a>
</li>
<li>
<a href="/about" title="About">
<span>About</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="first-entry home-info">
<header class="entry-header">
<h1>Margins & Throughput</h1>
</header>
<div class="entry-content">
<p>I’m Utku Altinkaya—CTO, product strategist, and builder of revenue-scale travel infrastructure.<br>
On this blog I share practical insights at the crossroads of <strong>architecture, margin optimization,</strong> and <strong>commercial growth</strong> for B2B travel.</p>
<p>I’m currently leading <strong>LodgingBase</strong>: a next-gen distribution layer that cuts look-to-book waste and lets suppliers manage margins with precision at global scale.</p>
<p>Connect on <a href="https://www.linkedin.com/in/mualtinkaya/">LinkedIn</a> or browse my work on <a href="https://github.com/mua">GitHub</a>.</p>
</div>
<footer class="entry-footer">
<div class="social-icons" >
</div>
</footer>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="/images/pmarkup.png" alt="Illustration of hotel price tags connected by data lines">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">7 Data‑Driven Tactics to Boost Profit with Precision Markups
</h2>
</header>
<div class="entry-content">
<p>Whether you manage pricing for a boutique hotel or run an OTA handling millions of daily searches, markups often feel like a constant struggle. Most teams rely on familiar routines, thinking, “+6 % worked last year, so let’s stick with it.”
Real-world scenario: At sunrise on 12 December, a mid-sized bedbank faced an alarming scenario—110 million hotel searches overnight, but profit per booking plummeted below 1 % and their API expenses surged by €12,000 within hours. After six weeks of targeted markup optimization, the same traffic yielded a 28 % increase in contribution margin without sacrificing significant number of bookings.
...</p>
</div>
<footer class="entry-footer"><span title='2025-07-06 00:00:00 +0000 UTC'>July 6, 2025</span></footer>
<a class="entry-link" aria-label="post link to 7 Data‑Driven Tactics to Boost Profit with Precision Markups" href="/posts/markups/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="/images/drain.jpg" alt="Travel image">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">The Hidden Cost of Look to Book
</h2>
</header>
<div class="entry-content">
<p>If you’re paying per API call, every extra look costs you real dollars, but it goes way beyond that. Here is how you can calculate the actual cost of each look to optimize your traffic.
Understanding Look to Book Ratio The Look to Book ratio measures how many search requests (looks) are needed to generate a single confirmed booking. The basic formula is:
$$ \text{Look to Book} = \frac{\text{Number of Searches}}{\text{Number of Bookings}} $$
...</p>
</div>
<footer class="entry-footer"><span title='2025-06-12 21:01:10 +0300 +03'>June 12, 2025</span> · 3 min · M. Utku Altinkaya</footer>
<a class="entry-link" aria-label="post link to The Hidden Cost of Look to Book" href="/posts/hidden-cost-of-look-to-book/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="/images/ylc.jpg" alt="Nodes">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">CTO Journal #2: Transforming a Car Rental Stack at Yolcu360
</h2>
</header>
<div class="entry-content">
<p>The journey from monolith to microservices, integrating GIS logic, and launching a GPT-4 powered chatbot.</p>
</div>
<footer class="entry-footer"><span title='2021-03-14 03:46:55 +0300 +03'>March 14, 2021</span> · 3 min · M. Utku Altinkaya</footer>
<a class="entry-link" aria-label="post link to CTO Journal #2: Transforming a Car Rental Stack at Yolcu360" href="/posts/yolcu-stack/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="/images/car.jpg" alt="Car rental experience">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Why We Moved to Microservices at Yolcu360
</h2>
</header>
<div class="entry-content">
<p>Yolcu360 is the largest online car rental platform in Turkey. At its inception, the system was a traditional Django monolith—typical for early-stage startups. When I stepped into the CTO role, we were facing performance bottlenecks and instability during traffic surges. For example an ad campaign with discounts in a popular tv show would degrade system performance and waste marketing budget.
This is not a unique story. Many startups build MVPs quickly, and those temporary decisions become permanent as the business scales. Over time, technical debt compounds, and the monolith becomes a liability. You often hear “just a refactor will fix it,” but in reality, few systems can sustain that illusion.
...</p>
</div>
<footer class="entry-footer"><span title='2021-03-14 03:46:55 +0300 +03'>March 14, 2021</span> · 2 min · M. Utku Altinkaya</footer>
<a class="entry-link" aria-label="post link to Why We Moved to Microservices at Yolcu360" href="/posts/car-rental/"></a>
</article>
<article class="post-entry">
<figure class="entry-cover">
<img loading="lazy" src="/images/hpro.jpg" alt="Nodes">
</figure>
<header class="entry-header">
<h2 class="entry-hint-parent">Serving 450,000 requests per minute in HotelsPro
</h2>
</header>
<div class="entry-content">
<p>How we built a travel search engine that served 450,000 requests per minute under 300ms, and what I’d do differently today.</p>
</div>
<footer class="entry-footer"><span title='2018-10-01 00:00:00 +0000 UTC'>October 1, 2018</span> · 3 min · M. Utku Altinkaya</footer>
<a class="entry-link" aria-label="post link to Serving 450,000 requests per minute in HotelsPro" href="/posts/metglobal/"></a>
</article>
</main>
<footer class="footer">
<span>© 2025 <a href="/">Margins and Throughput</a></span> ·
<span>
Powered by
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
</span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
</body>
</html>