Hi everyone,
I'm trying to set up a custom double opt-in process in Customer Insights – Journeys, and I could use some guidance.
I've created a custom boolean field on the Contact entity. When this field is set to "Yes," it triggers a journey that sends an email to the contact. What I want is for that email to function like Microsoft's standard double opt-in email — meaning when the contact clicks the confirmation button in the email, it should automatically create a Contact Point Consent record (opt-in) for the Commercial purpose. It would've been so easy, if i could just reuse the same DOI email as Microsoft generates. Unfortunately, that does not work.
I've looked into the built-in DOI process, but in this case I need to trigger the opt-in manually (i.e., from a seller or internal action, not from a form submission).
My questions
How can I build an email with a confirmation button that behaves like the standard DOI, and directly creates the opt-in?
Is there a way to include the standard DOI link or token in a custom email?
Or is there a workaround using a marketing page/form that submits the consent when opened/clicked — without needing the contact to fill anything out
Any ideas, best practices, or documentation links would be greatly appreciated.
Thanks in advance!
Custom Double Opt-In Trigger
Yes
html
CopyEdit
<script>
>
document.addEventListener("DOMContentLoaded", function () {
.
(
,
() {
setTimeout(function () {
var form = document.querySelector("form");
form =
);
if (form) form.submit();
(form) form.
();
}, 500); // wait for form to load and prefill
},
});
</script>
arduino
https://yourdomain.com/doi-confirmation?email={{contact.emailaddress1}}
https:
The built-in DOI process is tightly coupled to marketing form submissions, and the DOI email link is not exposed for reuse.
You cannot generate or insert that token manually into a custom journey/email.
Step 1: Create a Minimal DOI Marketing Page + Form
https://yourorg.crm.dynamics.com/marketing/pages/confirm-consent?id={{Contact.ContactId}}&email={{Contact.EmailAddress1}}
window.addEventListener("load", function() { // Wait for form to render, then trigger submit setTimeout(function() { let form = document.querySelector("form"); if (form) form.submit(); }, 500); });
Under review
Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.
As AI tools become more common, we’re introducing a Responsible AI Use…
We are honored to recognize Abhilash Warrier as our Community Spotlight honoree for…
These are the community rock stars!
Stay up to date on forum activity by subscribing.
Rishabh Kanaskar 159
MVP-Daniyal Khaleel 152
Tom_Gioielli 134 Super User 2025 Season 2