You could create a custom page template that contains the coupon where an URL parameter defines the expiration date if security isn’t a big concern. If it is, the expiration would need encryption so no one could URL hack themselves a coupon. You could also add a fake serial number containing a very simple checksum to provide some protection from someone photoshopping for their friends some later expiring coupons. Adding a nonce check would ensure only those provided the link could use the link and it would only be valid for a couple days and then the page throws an error. This is independent of the expiration date.
As a more obfuscation than encryption measure, you could provide a hexadecimal timestamp, reversing the hex string would make it appear like a fairly random ID string. Here’s a simple template example. You could add content as needed and add custom CSS such as a background image and dashed border to make more official looking.
<?php /* Template Name: Coupon */
get_header(); ?>
<div id="primary"><div id="content" role="main">
<div id="coupon">
<h2>FREE ADMITTANCE</h2>
This coupon entitles the bearer to free admittance to<br>
MY AWESOME VENUE<br>
Expires: <?php
//try adding "?id=0X52C08741" to this page's permalink
if(array_key_exists('id', $_GET)) {
echo date("Y-m-d H:i", $_GET['id'] ) . '<br>';
$day = date('d', $_GET['id'] ); $ck = $day + 11;
echo "YHK5DX{$ck}X9UC45";
} else echo 'Invalid ID - Cheatin' huh?'; ?>
</div>
</div></div>
<?php get_footer(); ?>
Place the contents in a .php file in your theme’s folder. Create a new page based on the “Coupon” template. Give it a title to establish a permalink. No content needs to be added in the page editor, it’s all on the template.
If you gave it a title of “Coupon”, the permalink would be something like https://www.example.com/coupon/. Add the suggested URL parameter “?id=0X52C08741” to this in your browser’s address bar and see the result. Notice the “serial number” has the date + 11 between the X’s.
Assuming the WordPress page ID is 1011, the date stamped coupon link could be generated with:
<?php echo get_permalink(1011) . '?id=0X' . strtoupper( base_convert( time() + (3600*24), 10, 16 ));?>
This surely isn’t exactly what you had in mind, but that’s the beauty of a custom solution, you can adjust it to anything you want.