Your promo codes, in your promo emails
Nothing connected an account’s promo codes to {{promo_code}} unless the campaign was an automation on the Promotional Code trigger. Two consequences:
- A one-time campaign built on a promo template sent the code, discount and expiry blank. There was no control anywhere to tell it which code you meant. Automations on the Promotional Code trigger were sending the right code, and are unchanged.
-
Every preview screen showed a sample code —
SPRING25at 20% off — regardless of what your account had, so the preview could never be trusted to show what would send.
Campaigns now carry a promo code of their own.
Open a campaign’s content step and, whenever the template you picked uses promo tags, a Promo Code field appears above the email setup listing your active and scheduled codes. Choose one and {{promo_code}}, {{discount_value}} and {{valid_until}} fill in from it everywhere they appear — subject, header, body, the code block, and the booking link. This is on the web and in the app.
Things worth knowing:
-
A campaign that needs a code can’t be published without one. The wizard shows the picker in exactly the cases publishing would reject, so you can’t be offered a state the server refuses. The message you get if you try now reads as a sentence rather than
trigger_params promo_code_id is required. - An automation on the Promotional Code trigger keeps picking its code in the trigger step and does not grow a second control. Both wizards read and write the same field, so the trigger step, the content step, the web app and the phone can never disagree about which code a campaign means.
- “Uses promo tags” is read from the content itself, walking the template as it stands rather than from a list of which starters are promotional — so a promo tag you type into any template counts, and a promo block you switched off does not.
- Only active and scheduled codes are offered. An expired or disabled code is not selectable.
The preview is the email
Preview and send now build their promo values in one place, so what you see before publishing is what your customer receives — including the booking link, which previously carried the sample code in its address even after the visible tags were corrected.
The preview’s sample customer is still fictional. The promo code is not.
The Limited-Time Offer template said 20%
The starter template hardcoded 20% in its header and promo intro while the code itself came from a merge tag, so a 15% code sent an email whose wording promised 20% off next to the correct code. This one did go out wrong. It now reads the code’s real discount.
Copies already seeded into your account are updated in place — but only where the wording is untouched, so any edit you made to that header survives, and a campaign that has already sent is never modified, because its content is the record of what went out.
Also here
- The Insert variable / Available Variables list offers the promo tags once a code is selected.
- The link-tag picker in the template editor no longer offers a custom URL tag. Nothing ever populated it, so an inserted one rendered an empty link. Templates already carrying one still resolve as before.
Markate estimates and invoices now import
Markate was selectable as an import source but carried customers only, so a business migrating off Markate arrived with no quote or invoice history. Both are now supported, built against real Markate exports.
- Estimates import as quotes and invoices import as invoices, each with their line items.
- Customers come across either way. Neither Markate export carries a customer id, so customers are derived from the rows themselves. Importing estimates first, invoices first, or only one of the two all converge on the same set of customers — no duplicates, and no order you have to get right.
- Re-running an import no longer doubles line items. A record that already existed had its line items inserted a second time on every re-import. This affected all import sources, not just Markate, and is fixed for all of them.
- Multi-line cells import intact. A quoted CSV cell containing line breaks — Markate’s Items column, and customer Notes — was being flattened into a run-on string.
- Markate reuses an invoice number for genuinely different invoices issued months apart; those are kept as separate invoices rather than collapsed into one.
Nothing changes for imports already completed. Use the Import action on your Quotes and Invoicing & Payments lists to bring the new entities in.
Update mobile app to CleanOps 1.2.10 (Build 84).