How to do Pagination with UUID v4 and Created Time on Concurrent Inserted Data?
SELECT * FROM payment_with_uuid 
WHERE 
created_time &lt;= '2020-05-24 21:27:10' :: timestamp
AND 
id &lt;'fffe3477-1710-45c4-b554-b539a9ee8fa7' 
ORDER BY created_time DESC, id DESC LIMIT 10;



This is wrong, but it shouldn't lead to the problem you indicate of the same row showing up on page 1, 2, etc.  Rather it would result in most rows failing to show up at all, because the two filters are implemented independently.  You need to implement the id filter only within ties of the created_time filter.  Elegance I guess is a matter of opinion, but it seems to me that the most elegant solution is the tuple comparator similar to what you had attempted to include in your original question.

SELECT * FROM payment_with_uuid 
WHERE 
(created_time,id) &lt; ('2020-05-24 21:27:10' :: timestamp, 'fffe3477-1710-45c4-b554-b539a9ee8fa7') 
ORDER BY created_time DESC, id DESC LIMIT 10;


Now the timestamp should really be exact, it doesn't look like yours is. 
How is it getting rounded to the nearest second?  In my hands it looks more like 2020-05-25 09:16:29.380925-04

If for some reason you don't want to use the tuple comparator, then you need to include the timestamp twice, once for less than and once for equal to:

WHERE 
created_time &lt; '2020-05-24 21:27:10' :: timestamp
OR  
(
    created_time = '2020-05-24 21:27:10' :: timestamp 
    AND 
    id &lt;'fffe3477-1710-45c4-b554-b539a9ee8fa7' 
)


In addition to not being very elegant, this will probably not use the index very effectively.  You could use boolean reasoning to re-write it to avoid that top-level OR, so that it can use the index, but then it will get even harder to read and understand.