{"id":380014,"date":"2026-10-18T17:35:22","date_gmt":"2026-10-18T17:35:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/signsealer\/"},"modified":"2026-10-18T17:34:44","modified_gmt":"2026-10-18T17:34:44","slug":"signsealer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/signsealer\/","author":23568845,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.17.1","stable_tag":"1.17.1","tested":"7.1.3","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"SignSealer","header_author":"Mashdun LLC","header_description":"Send waivers, rental agreements and acknowledgments from WordPress, and see who has signed. The signing happens on SignSealer; this plugin holds ids and status, never evidence.","assets_banners_color":"124272","last_updated":"2026-10-18 17:34:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/signsealer.com\/integrations","header_author_uri":"https:\/\/signsealer.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":34,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.17.1":{"tag":"1.17.1","author":"mashdunllc","date":"2026-10-18 17:34:44","revision":3753388}},"upgrade_notice":{"1.17.1":"<p>Saving a form&#039;s settings keeps every line of its extra blanks, which 1.17.0 joined into one. Automator&#039;s &quot;Any form&quot; is the business&#039;s forms only.<\/p>","1.17.0":"<p>A form&#039;s answers for your own code and for Uncanny Automator recipes, asked for when a document completes. The plugin stores none of them.<\/p>","1.16.2":"<p>Stylesheets and scripts in files of their own, output escaped as it is printed, and no token on the plugin&#039;s public page.<\/p>","1.16.1":"<p>Nonces on the forms the plugin draws for visitors and on Amelia&#039;s question; fewer admin notices.<\/p>","1.16.0":"<p>Amelia and Simply Schedule Appointments: the person who booked signs on the page, Amelia before it books.<\/p>","1.15.0":"<p>An optional &quot;Signed with SignSealer&quot; line under the signing button, off unless you turn it on.<\/p>","1.14.5":"<p>Connecting finishes by itself when SignSealer did not answer at first, and the signing button keeps its business after the token is refreshed.<\/p>","1.14.4":"<p>Security and reliability fixes from a review: no unserializing of form answers, one token refresh at a time, and a limit on agreements started by one visitor.<\/p>","1.14.3":"<p>Wording on SignSealer \u2192 Bookings, and new screenshots.<\/p>","1.14.2":"<p>No change in what it does: Plugin Check reports nothing at any severity.<\/p>","1.14.1":"<p>Start here: a card and a guide for each of Amelia, LatePoint and Simply Schedule Appointments.<\/p>","1.14.0":"<p>Bookly: an appointment booked on its form can now start its agreement.<\/p>","1.13.0":"<p>MotoPress Hotel Booking: a confirmed stay can now start its rental agreement.<\/p>","1.12.0":"<p>FluentBooking: a meeting or lesson booked on its pages can now start its agreement.<\/p>","1.11.0":"<p>Booking Calendar: a booking on its calendar can now start its agreement.<\/p>","1.10.0":"<p>Events Manager: a booking for an event can now start its waiver or agreement.<\/p>","1.9.0":"<p>Event Tickets: an RSVP or a ticket for an event can now start its waiver or agreement.<\/p>","1.8.0":"<p>Forminator, MetForm, Everest Forms and JetFormBuilder: a form submission in each can now start a signing, before or after the form is sent. Amelia, LatePoint and Simply Schedule Appointments: a booking can start its agreement.<\/p>","1.7.1":"<p>A rental agreement&#039;s pickup and return boxes, filled in by the sender, are listed with the form&#039;s other blanks.<\/p>","1.7.0":"<p>Formidable Forms, Ninja Forms and SureForms. A form can sign before it is sent. Form settings move into each form plugin, the shop&#039;s into WooCommerce \u2192 Settings. A template&#039;s extra blanks are answered by you or asked of the person. The link to sign is a button.<\/p>","1.6.3":"<p>WooCommerce no longer marks the plugin incompatible with its block cart and checkout.<\/p>","1.6.2":"<p>With signing before payment, the cart sends customers to sign first, and the signing page looks like part of your shop.<\/p>","1.6.1":"<p>An order&#039;s agreement no longer shows as &quot;draft&quot; for a moment after it is sent.<\/p>","1.6.0":"<p>Customers can ask for the signing link by text as well as email, at checkout or on a form, when your SignSealer plan includes texting.<\/p>","1.5.1":"<p>The Sign button is styled on block themes, and the thank-you page asks for the signature once, near the top.<\/p>","1.5.0":"<p>SignSealer moves from Settings to its own menu item, with a Start here page that explains each integration. Old links still work.<\/p>","1.4.2":"<p>Deleting the plugin now removes everything it stored.<\/p>","1.4.1":"<p>Gravity Forms submissions now go straight to the signing page, and spam entries start nothing.<\/p>","1.4.0":"<p>WooCommerce can require the agreement to be signed before payment.<\/p>","1.3.2":"<p>Reconnecting no longer adds a duplicate webhook endpoint.<\/p>","1.3.1":"<p>The block&#039;s editor script updates with the plugin and can be translated.<\/p>","1.3.0":"<p>Connecting no longer asks for an application id and secret. Already\nconnected sites are unaffected.<\/p>","1.2.0":"<p>WooCommerce Bookings and Contact Form 7. Nothing changes for a site that uses\nneither.<\/p>","1.1.0":"<p>WooCommerce, Gravity Forms, WPForms and Fluent Forms integrations, and the\nsigner is sent back to your site afterwards. Nothing changes for a site that\nuses none of them.<\/p>","1.0.1":"<p>Three screens that told you something untrue. One of them, if you did what it\nsaid, registered a second webhook endpoint and doubled what you were billed\nfor deliveries.<\/p>","1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3753388,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3753388,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3753388,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3753388,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"signsealer\/sign":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"signsealer\/sign","title":"SignSealer agreement","category":"widgets","icon":"edit-page","description":"A button that sends a visitor to sign a SignSealer form.","textdomain":"signsealer","attributes":{"workflow":{"type":"string","default":""},"label":{"type":"string","default":"Sign now"}},"supports":{"html":false,"align":["left","center","right"]},"editorScript":"file:.\/editor.js","render":"file:..\/render.php"}},"tagged_versions":["1.17.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3753388,"resolution":"1","location":"assets","locale":"","width":1996,"height":2300},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3753388,"resolution":"2","location":"assets","locale":"","width":1996,"height":1196},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3753388,"resolution":"3","location":"assets","locale":"","width":1996,"height":1168},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3753388,"resolution":"4","location":"assets","locale":"","width":2400,"height":1640},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3753388,"resolution":"5","location":"assets","locale":"","width":2400,"height":1640}},"screenshots":{"1":"SignSealer \u2192 Start here: connected to the business, with a card for each\nintegration and its steps.","2":"SignSealer \u2192 Bookings: the agreement each accommodation type starts, and\nthe answer to a blank the booking does not fill.","3":"SignSealer \u2192 Templates: the business's forms and templates, with the\nshortcode for each.","4":"With Before payment, the cart sends the customer to sign the agreement\nfirst.","5":"The signing page on your own site, in your theme."}},"plugin_section":[],"plugin_tags":[1902,147709,147615,723,57747],"plugin_category":[],"plugin_contributors":[287401],"plugin_business_model":[],"class_list":["post-380014","plugin","type-plugin","status-publish","hentry","plugin_tags-agreement","plugin_tags-contract","plugin_tags-esignature","plugin_tags-signature","plugin_tags-waiver","plugin_contributors-mashdunllc","plugin_committers-mashdunllc"],"banners":{"banner":"https:\/\/ps.w.org\/signsealer\/assets\/banner-772x250.png?rev=3753388","banner_2x":"https:\/\/ps.w.org\/signsealer\/assets\/banner-1544x500.png?rev=3753388","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/signsealer\/assets\/icon-128x128.png?rev=3753388","icon_2x":"https:\/\/ps.w.org\/signsealer\/assets\/icon-256x256.png?rev=3753388","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/signsealer\/assets\/screenshot-1.png?rev=3753388","caption":"SignSealer \u2192 Start here: connected to the business, with a card for each\nintegration and its steps."},{"src":"https:\/\/ps.w.org\/signsealer\/assets\/screenshot-2.png?rev=3753388","caption":"SignSealer \u2192 Bookings: the agreement each accommodation type starts, and\nthe answer to a blank the booking does not fill."},{"src":"https:\/\/ps.w.org\/signsealer\/assets\/screenshot-3.png?rev=3753388","caption":"SignSealer \u2192 Templates: the business's forms and templates, with the\nshortcode for each."},{"src":"https:\/\/ps.w.org\/signsealer\/assets\/screenshot-4.png?rev=3753388","caption":"With Before payment, the cart sends the customer to sign the agreement\nfirst."},{"src":"https:\/\/ps.w.org\/signsealer\/assets\/screenshot-5.png?rev=3753388","caption":"The signing page on your own site, in your theme."}],"raw_content":"<!--section=description-->\n<p>Your site sends somebody a document to sign, and later wants to know whether they signed it. That is the whole job of this plugin.<\/p>\n\n<p>Everything that makes a signature worth having happens on SignSealer: consent recorded as its own event before the signature is accepted, the document's exact text fingerprinted into every entry on the trail, and a hash chain that breaks if any entry is altered. A certificate can be checked afterwards by anyone holding its code, without an account.<\/p>\n\n<p><strong>You need a SignSealer account.<\/strong> This plugin is a client for it. See https:\/\/signsealer.com.<\/p>\n\n<h4>Three things this plugin refuses to do<\/h4>\n\n<p>These are limits on purpose, not features that are missing.<\/p>\n\n<p><strong>It never renders a signature pad.<\/strong> Signing happens on SignSealer's own pages. A drawing captured in WordPress and posted to an API would make every claim on the certificate untrue \u2014 the certificate says what the signing engine observed, and it cannot observe something that arrived as a form field.<\/p>\n\n<p><strong>It never stores evidence.<\/strong> Document ids, a status and a link. If you restore a six-month-old backup of this site, nothing about any signature changes, because nothing about any signature was here.<\/p>\n\n<p><strong>It never holds a master credential.<\/strong> The connection is OAuth 2.0 with PKCE, scoped to one business, and you can end it from your own SignSealer account without touching WordPress. There is no key here that reaches two accounts.<\/p>\n\n<h4>Why a link, and a frame only where the site is proven<\/h4>\n\n<p>SignSealer's signing pages refuse to be framed (<code>frame-ancestors<\/code>) on any site the business has not proven is its own. A signing page inside another site's frame is a clickjacking target, and the thing being clicked is a signature. So the block, the shortcode and the forms send the signer to SignSealer's own page, where they can see whose address bar they are signing on. The frames are where signing comes first, on this site: WooCommerce's <strong>Before payment<\/strong>, a form set to be signed before it is sent, and Amelia's and Simply Schedule Appointments' signing before the booking. Connecting the plugin proves the site to SignSealer, which is what lets its signing page be shown here.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Connects your site to one SignSealer business over OAuth 2.0 with PKCE.<\/li>\n<li>Registers its own webhook endpoint when you connect, so there is no secret to copy between two screens.<\/li>\n<li>Verifies every delivery: the HMAC signature, a five-minute freshness window, and a replay it has already seen. Fires a <code>signsealer_event<\/code> action your own code can hook.<\/li>\n<li>Has its own <strong>SignSealer<\/strong> item in the admin menu. <strong>Start here<\/strong> says what the plugin does, whether the site is connected, and \u2014 for every integration \u2014 whether its plugin is on the site, whether it is set up, and the steps to set it up.<\/li>\n<li>Lists that business's forms and templates under <strong>SignSealer \u2192 Templates<\/strong>, with the shortcode for each one beside it.<\/li>\n<li>Gives you a <strong>SignSealer agreement<\/strong> block, and <code>[signsealer_sign workflow=\"your-form\"]<\/code> if you prefer a shortcode.<\/li>\n<li><strong>WooCommerce:<\/strong> mark a product as needing an agreement, and the document is started when the order is paid (or placed, your choice), offered on the thank-you page, in the order email and under My Account, with its status on the order screen and in the order notes. Or have it signed before payment: the cart's checkout button becomes \"Sign the agreement\", the customer signs on your site, in a frame, and the checkout will not place the order until it is signed. Its settings are under <strong>WooCommerce \u2192 Settings \u2192 SignSealer<\/strong>.<\/li>\n<li><strong>Details the agreement needs:<\/strong> a template that asks for more than an order knows \u2014 where it takes place, a vessel's name \u2014 is answered on the product by you, or asked of the customer before they sign.<\/li>\n<li><strong>WooCommerce Bookings:<\/strong> a booking you confirm starts its agreement straight away, paid or not, and the booking's date, time, number of people and resource are filled into the template.<\/li>\n<li><strong>Amelia, LatePoint and Simply Schedule Appointments:<\/strong> choose the workflow a booking of each service starts, under <strong>SignSealer \u2192 Bookings<\/strong>. The person who booked is emailed the link to sign, and the booking fills in the service, the date and time, how many people, who runs it and where. Amelia's form opens the agreement before it books, and books once it is signed; Simply Schedule Appointments opens it over the page as soon as the booking is made; LatePoint's confirmation step shows a button to sign.<\/li>\n<li><strong>Event Tickets:<\/strong> RSVPs and tickets for your events, under <strong>SignSealer \u2192 Bookings<\/strong>: one workflow every ticket and RSVP starts, and a different one for any ticket that needs it. Whoever booked is emailed the link to sign, for everyone they booked, and the event fills in its name, date, time, venue and organizer, and how many people. The RSVP's own message and the order page show a button to sign.<\/li>\n<li><strong>Events Manager:<\/strong> bookings for your events, under <strong>SignSealer \u2192 Bookings<\/strong>: one workflow every event's bookings start, and a different one for any event that needs it. Whoever booked is emailed the link to sign, for the spaces they booked, and the event fills in its name, date, time, location and tickets. Events Manager's own message after booking shows a button to sign.<\/li>\n<li><strong>Booking Calendar:<\/strong> choose the workflow every booking starts, under <strong>SignSealer \u2192 Bookings<\/strong>. Whoever booked is emailed the link to sign, and the booking fills in the date (and the time, for a time slot), how many people, and the name, email and phone from its form. Booking Calendar's own message after booking shows a button to sign.<\/li>\n<li><strong>FluentBooking:<\/strong> meetings, lessons and sessions booked on its event types, under <strong>SignSealer \u2192 Bookings<\/strong>: one workflow every event type starts, and a different one for any that needs it. Whoever booked is emailed the link to sign, with the event type, the date and time, the host and an in-person place filled in, and FluentBooking's own confirmation shows a button to sign.<\/li>\n<li><strong>MotoPress Hotel Booking:<\/strong> stays at your accommodation types, under <strong>SignSealer \u2192 Bookings<\/strong>: one workflow every booking starts, and a different one for any accommodation type that needs it. Once a booking is confirmed, the guest is emailed the link to sign, with the check-in date and time, the check-out date, the nights and everybody staying filled in, and its Booking Confirmed page shows a button to sign.<\/li>\n<li><strong>Bookly:<\/strong> appointments booked with your services, under <strong>SignSealer \u2192 Bookings<\/strong>: one workflow every service starts, and a different one for any service that needs it. Once a booking is approved, the customer is emailed the link to sign, with the service, the date and time, how many people and the staff member filled in, and the last step of Bookly's booking form shows a button to sign.<\/li>\n<li><strong>Gravity Forms, WPForms, Fluent Forms, Contact Form 7, Formidable Forms, Ninja Forms, SureForms, Forminator, MetForm, Everest Forms and JetFormBuilder:<\/strong> map a form to a workflow in that form's own settings (in Ninja Forms, a SignSealer action) \u2014 which field is the email, which is the name, which field answers each blank the template asks \u2014 and a submission ends on the signing page, or with a button to sign in the form's own confirmation. Or the form signs first: pressing its button opens the agreement over the form, and the form is sent once it is signed. A blank the form does not ask is asked on your site just before signing. <strong>SignSealer \u2192 Forms<\/strong> lists every form, with a link to its settings.<\/li>\n<li><strong>The button to sign<\/strong> is SignSealer blue, a colour of your own, or your theme's own button, as you choose under <strong>SignSealer \u2192 Settings<\/strong>.<\/li>\n<li>Sends the signer back to your site afterwards: the order they came from, or the page the form was on.<\/li>\n<\/ul>\n\n<h4>For developers<\/h4>\n\n<p>Every verified delivery fires an action:<\/p>\n\n<pre><code>add_action( 'signsealer_event', function ( $event, $payload ) {\n    if ( 'signing.completed' === $event ) {\n        \/\/ $payload['document']['id'] has signed.\n    }\n}, 10, 2 );\n<\/code><\/pre>\n\n<p>The signature is checked before this fires, so a handler can trust what it is handed.<\/p>\n\n<p>Once a document completes, its signers' answers to your form's questions\nare handed to <code>signsealer_document_completed<\/code>, asked for from SignSealer\njust after the delivery. This plugin stores none of them; what your own code\ndoes with them is up to it:<\/p>\n\n<pre><code>add_action( 'signsealer_document_completed', function ( $document ) {\n    if ( 'Yes' === ( $document['answer']['married'] ?? '' ) ) {\n        \/\/ \"Are you married?\" was answered Yes.\n    }\n} );\n\n$document['answer'] has one value per question, by the question's key; a\n<\/code><\/pre>\n\n<p>tick box is <code>Yes<\/code> or <code>No<\/code>. A question more than one person answered (two\nsigners, each person in a party) holds every different answer, sorted and\njoined with a comma: <code>Yes<\/code> means everyone said Yes, <code>No, Yes<\/code> that they\ndiffered. <code>answers_text<\/code> is every answer,\none line each, for an email; <code>answers<\/code> has each one with who gave it.\nSensitive answers are masked, as your staff see them. To ask for a\ndocument's answers yourself: <code>signsealer_get_answers( $document_id )<\/code>.\nIt runs from WP-Cron, so on a site that runs WP-Cron from the server it\nwaits for the next run.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the SignSealer API at <code>https:\/\/api.signsealer.com<\/code> \u2014 the service it is a client for. It is required for the plugin to do anything.<\/p>\n\n<p><strong>What is sent, and when:<\/strong><\/p>\n\n<ul>\n<li>When you press Connect: this site's address and a one-time token, so SignSealer can fetch <code>\/wp-json\/signsealer\/v1\/site<\/code> on this site, confirm the plugin is running here, and register an application for this site. Then the PKCE challenge, once, as the browser is sent to approve, and, when you have approved, the code SignSealer hands back with the PKCE verifier and this site's application id and secret, exchanged for an access token and a refresh token. The refresh token is exchanged again whenever the access token runs out.<\/li>\n<li>Once connected: a request for your business's name and address on SignSealer, and the registration of this site's webhook address (<code>\/wp-json\/signsealer\/v1\/webhook<\/code>, named \"WordPress: \" and this site's host) for SignSealer's events. The Settings screen lists that registration, and can ask for a new webhook secret.<\/li>\n<li>On every call afterwards: an access token, and this site's address in the user-agent header so a support request can be traced.<\/li>\n<li>When you send a document: the template you chose, the values you filled in, and the signer's name and email address.<\/li>\n<li>When a WooCommerce order starts a document: the customer's name, email address and phone number if given, the order number, the product's name and quantity, the answers you gave on the product to the agreement's other blanks, any the customer typed on the page that asked them, and the address of the order-received page to send them back to.<\/li>\n<li>When a customer signs before payment: the name and email address they type, the product's name and quantity, the answers to the agreement's other blanks (yours from the product, and theirs from the page), and the address of the signing page on your site to send them back to. Their session keeps the document's id and signing link until the order is placed.<\/li>\n<li>When a form submission starts a document: the values of the fields you mapped (email address, name, phone, and any template blanks), any answer you typed for a blank in the form's settings, and the address of the page the form was on.<\/li>\n<li>When a booking starts a document (LatePoint, Amelia, Simply Schedule Appointments, Event Tickets, Events Manager, Booking Calendar, FluentBooking, MotoPress Hotel Booking or Bookly): the customer's name, email address and phone if given; the service, event or room; the date and time; how many people; the staff member and location, and the check-out date and nights, where the booking has them; the booking's id; and the answers you set for the agreement's other blanks.<\/li>\n<li>While somebody signs first (before payment, before a form is sent, or before an Amelia or Simply Schedule Appointments booking): requests for whether they have signed yet. If an Amelia booking signed for in advance is never made, a request an hour later to void that document.<\/li>\n<li>When the \"Signed with SignSealer\" credit is on: a request for your business's branding, for the credit's wording, while the Settings screen shows it.<\/li>\n<li>When somebody ticks a box to be texted, at checkout or on a form, before the document starts: their phone number, the words beside the box exactly as they saw them, and which form or order it was, on which site. SignSealer keeps this as the record of their consent to be texted about that document.<\/li>\n<li>Every ten minutes at most, while an administrator screen or the checkout asks: a request for whether your SignSealer business can send texts, and the wording to show beside a box to be texted.<\/li>\n<li>When a document completes, and only if your own code or an Uncanny Automator recipe is listening for its answers (the <code>signsealer_document_completed<\/code> action): a request for that document, by its id, tried again up to four more times over about fifteen minutes if SignSealer cannot be reached. Its title, status, your reference and its signers' answers come back, sensitive answers masked, and are handed to that code or recipe. This plugin stores none of it; Uncanny Automator keeps each run's tokens in its own log, as it does for every trigger.<\/li>\n<li>While you build an Uncanny Automator recipe with SignSealer's trigger, and when that trigger runs: requests for your forms and, for the form chosen, the questions it asks. The questions are kept for an hour.<\/li>\n<\/ul>\n\n<p><strong>What is received:<\/strong> access and refresh tokens, your business's name, address and branding, this site's webhook registration and its secret, template and workflow lists, a form's questions, document ids and statuses, whether a signer has signed, signing links, a completed document's answers when asked for as above, and whether your business can send texts, with the wording for the box.<\/p>\n\n<p>SignSealer is operated by Mashdun LLC.\nTerms: https:\/\/signsealer.com\/legal\/terms\nPrivacy policy: https:\/\/signsealer.com\/legal\/privacy-policy\nSubprocessors: https:\/\/signsealer.com\/security\/subprocessors<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Open <strong>SignSealer \u2192 Start here<\/strong> in the admin menu and press <strong>Connect to SignSealer<\/strong>.<\/li>\n<li><p>Sign in to SignSealer (or create an account there), choose the business this site belongs to, and approve. You are brought straight back.<\/p><\/li>\n<li><p>Back on Start here, pick the integrations you want. Each card has its three steps and a link to a step-by-step guide at https:\/\/signsealer.com\/wordpress.<\/p><\/li>\n<\/ol>\n\n<p>The plugin registers itself with SignSealer, registers its own webhook endpoint, and signed statuses start arriving with nothing to copy or paste. Your site must be on https: SignSealer checks the plugin is really running there before it connects, and https is also how it posts signed statuses back.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20does%20my%20site%20need%20to%20be%20on%20https%3F\"><h3>Why does my site need to be on https?<\/h3><\/dt>\n<dd><p>Two reasons. Before SignSealer connects a site it fetches a small page the plugin serves, to check the plugin is really running there and that the request came from this site; it will only do that over https, so nobody can register an application in your site's name. And once connected, SignSealer posts signed statuses back to your site, which must also be over https so those deliveries are private and verifiable.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20signsealer%20account%3F\"><h3>Do I need a SignSealer account?<\/h3><\/dt>\n<dd><p>Yes. This plugin talks to the SignSealer API; it is not a standalone signing tool.<\/p><\/dd>\n<dt id=\"where%20is%20the%20signed%20document%20kept%3F\"><h3>Where is the signed document kept?<\/h3><\/dt>\n<dd><p>On SignSealer, with its certificate and audit trail. This site keeps the document's id and its status so a page can say whether it is signed.<\/p><\/dd>\n<dt id=\"can%20i%20collect%20the%20signature%20on%20my%20own%20page%3F\"><h3>Can I collect the signature on my own page?<\/h3><\/dt>\n<dd><p>No, and that is deliberate. See \"Three things this plugin refuses to do\" above.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20add%20a%20link%20or%20a%20credit%20to%20my%20site%3F\"><h3>Does the plugin add a link or a credit to my site?<\/h3><\/dt>\n<dd><p>Not unless you ask it to. Under SignSealer \u2192 Settings \u2192 The sign button there is a setting, off by default, that puts a small \"Signed with SignSealer\" line under the signing button block and the <code>[signsealer_sign]<\/code> shortcode, linking to signsealer.com. Only a button to your own business's form gets it: nothing else the plugin shows, and not a shortcode pointed at another business. A business with white label is not offered it.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Nothing at SignSealer. Your documents, evidence and certificates are unaffected. Deactivating does not revoke the connection \u2014 end that in SignSealer under Developers \u2192 Connected apps.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. On a product's edit screen, under General, choose the <strong>SignSealer agreement<\/strong> that product needs. When an order containing it is paid \u2014 or placed, under WooCommerce \u2192 Settings \u2192 SignSealer \u2014 the document is started for the customer, offered on the thank-you page, in their order email and under My Account, and its status appears on the order screen and in the order notes as SignSealer reports it. Works whether your orders live in posts or in WooCommerce's own order tables.<\/p><\/dd>\n<dt id=\"can%20the%20customer%20sign%20before%20they%20pay%3F\"><h3>Can the customer sign before they pay?<\/h3><\/dt>\n<dd><p>Yes. Under WooCommerce \u2192 Settings \u2192 SignSealer choose <strong>Before payment<\/strong>. While a customer's cart holds a product whose agreement is unsigned, the cart's checkout button reads <strong>Sign the agreement<\/strong> and goes to a page of your site, in your theme, that shows SignSealer's signing page in a frame; a customer who reaches the checkout some other way is sent back to it. The classic checkout and the checkout block both refuse to place the order until SignSealer confirms it is signed, and the order then carries that signed document. SignSealer shows its signing page in a frame only on sites the business has proven, and the site you connected is one.<\/p><\/dd>\n<dt id=\"my%20agreement%20asks%20for%20something%20the%20order%20does%20not%20know\"><h3>My agreement asks for something the order does not know<\/h3><\/dt>\n<dd><p>A template blank that nothing fills \u2014 <code>{{location}}<\/code> on a photo release, say \u2014 would make SignSealer refuse to start the document. So on the product's edit screen, under its SignSealer agreement, each such blank has a box: fill it in to answer it for every order of that product, or leave it empty and the customer is asked. Before payment they are asked on the signing page, beside their name and email. After payment the order's Sign link \u2014 on the thank-you page, in the order email and under My Account \u2014 opens a page of your site that asks, and the agreement is sent once they have answered. The order notes say when an agreement is waiting for that.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20bookings%3F\"><h3>Does it work with WooCommerce Bookings?<\/h3><\/dt>\n<dd><p>Yes. A bookable product is a product, so mark it the same way. A booking you confirm starts its agreement at once, whether or not it has been paid, because the agreement is wanted before the day. The booking's date, time, number of people and resource go to the template as <code>booking_date<\/code>, <code>booking_time<\/code>, <code>persons<\/code> and <code>resource<\/code>, and the booking's own screen shows where the agreement stands.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20amelia%2C%20latepoint%20or%20simply%20schedule%20appointments%3F\"><h3>Does it work with Amelia, LatePoint or Simply Schedule Appointments?<\/h3><\/dt>\n<dd><p>Yes, since 1.8.0. Open SignSealer \u2192 Bookings, which lists the services in each (in Simply Schedule Appointments, its appointment types), and choose the workflow a booking of each starts. A booking made through the plugin's booking form, or by staff, starts that workflow for the person who booked, and SignSealer emails them the link; LatePoint's confirmation step shows a button to sign too. Since 1.16.0 the person signs on the page in the other two as well. Amelia's booking form opens the agreement over itself when the person presses Book, and makes the booking once it is signed (a booking Amelia takes payment for through Stripe or WooCommerce is made first, and the agreement opens just after). Simply Schedule Appointments opens it over the page as soon as the booking is made, or on the page its form sends people to afterwards. Closed without signing, a button to sign stays on the page, and the email has the link. In Simply Schedule Appointments an appointment waiting on payment starts its agreement once it is booked. The booking fills in <code>booking_date<\/code>, <code>booking_time<\/code>, <code>service_name<\/code>, <code>persons<\/code> and <code>staff<\/code>. Any other blank the agreement asks is listed under the service: choose what of the booking answers it (a <code>location<\/code> blank is given the booking's location, when the plugin has locations set up), or type the answer to use for every booking of that service. A booking saved again \u2014 rescheduled, confirmed, paid \u2014 starts nothing a second time, and a canceled one starts nothing. If a booking could not start its agreement, SignSealer \u2192 Bookings says which and why.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20event%20tickets%3F\"><h3>Does it work with Event Tickets?<\/h3><\/dt>\n<dd><p>Yes, since 1.9.0: its RSVPs (the ones Event Tickets 5.30 makes, and the older kind a site has not moved over yet) and its Tickets Commerce tickets, free or paid. Open SignSealer \u2192 Bookings. Under Event Tickets, the first row is every ticket and RSVP; each ticket of the events still to come is listed under it, for any that should start a different workflow. Whoever RSVPs or buys is emailed the link to sign: one agreement for each ticket in their order, saying how many people it is for, because Event Tickets asks one name and email an order. A logged-in visitor's RSVP is under their account's email, as Event Tickets records it. The event fills in <code>service_name<\/code> (the event's name), <code>ticket_name<\/code>, <code>booking_date<\/code>, <code>booking_time<\/code>, <code>persons<\/code>, <code>location<\/code> (its venue) and <code>staff<\/code> (its organizer); an RSVP on a page rather than an event fills in the page's name, the ticket and how many. The RSVP's \"received\" message and the order page show a button to sign. An RSVP of \"not going\" starts nothing, and a ticket starts its agreement once its order is completed. Event Tickets Plus, the paid add-on that sells tickets through WooCommerce, has not been tested.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20events%20manager%3F\"><h3>Does it work with Events Manager?<\/h3><\/dt>\n<dd><p>Yes, since 1.10.0. Open SignSealer \u2192 Bookings. Under Events Manager, the first row is every event; each event still to come is listed under it, with its date, for any that should start a different workflow (each date of a recurring event is an event of its own). A booking starts its agreement for the person who booked, one agreement a booking with <code>persons<\/code> the spaces they took, and SignSealer emails them the link; Events Manager's own message after booking shows a button to sign too. A booking waiting for your approval starts it; one waiting on a payment starts it once it is approved; a rejected or cancelled one starts nothing; approving a booking later starts nothing a second time. The event fills in <code>service_name<\/code> (the event's name), <code>ticket_name<\/code>, <code>booking_date<\/code> and <code>booking_time<\/code> (in the event's own time zone), <code>persons<\/code> and <code>location<\/code>. Events Manager Pro's payments and forms have not been tested.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20booking%20calendar%3F\"><h3>Does it work with Booking Calendar?<\/h3><\/dt>\n<dd><p>Yes, since 1.11.0, with the free Booking Calendar's calendar. Open SignSealer \u2192 Bookings and choose the workflow every booking starts. A booking made on the calendar, or added in its admin, starts that workflow for whoever booked, and SignSealer emails them the link; Booking Calendar's own message after booking shows a button to sign too (with its \"message\" setting for after booking; with its own thank-you page, the email is the way). Its form's fields are read by name: <code>firstname<\/code> (or <code>name<\/code>) and <code>secondname<\/code>, <code>email<\/code> (or any email field), <code>phone<\/code>, and <code>adults<\/code> and <code>children<\/code> (or <code>visitors<\/code>) for <code>persons<\/code>. The booking fills in <code>booking_date<\/code> (its first day) and <code>booking_time<\/code> for a time slot. A booking waiting for your approval starts its agreement, and an edited booking does not start a second one. The paid editions' separate resources are not listed yet: their bookings start the one workflow.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20fluentbooking%3F\"><h3>Does it work with FluentBooking?<\/h3><\/dt>\n<dd><p>Yes, since 1.12.0. Open SignSealer \u2192 Bookings. Under FluentBooking, the first row is every event type; each active event type is listed under it, by its calendar, for any that should start a different workflow. A booking starts its agreement once it is scheduled: booked on its page, added by the host, or, for one waiting for the host's confirmation or a payment, once confirmed or paid. SignSealer emails the person the link, and FluentBooking's confirmation (and its receipt page) shows a button to sign. The booking fills in <code>service_name<\/code> (the event type), <code>booking_date<\/code> and <code>booking_time<\/code> (in the calendar's time zone), <code>persons<\/code>, <code>staff<\/code> (the host) and <code>location<\/code> for an in-person place, with the person's name, email and phone. In a group event each person has a booking of their own and signs their own. FluentBooking Pro's group, round-robin and multi-slot bookings have not been tested.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20motopress%20hotel%20booking%3F\"><h3>Does it work with MotoPress Hotel Booking?<\/h3><\/dt>\n<dd><p>Yes, since 1.13.0, with the free MotoPress Hotel Booking Lite (and the paid version, which has the same hooks). Open SignSealer \u2192 Bookings. Under MotoPress Hotel Booking, the first row is every accommodation type; each type is listed under it, for any that should start a different rental agreement. A booking starts its agreement once it is confirmed: by the guest's email link (its default), by you, or by a payment. SignSealer emails the guest the link, and its Booking Confirmed page (and Reservation Received after a payment) shows a button to sign. The booking fills in <code>booking_date<\/code> and <code>booking_time<\/code> (the check-in date and the site's check-in time), <code>check_out_date<\/code>, <code>nights<\/code>, <code>service_name<\/code> (the accommodation types booked) and <code>persons<\/code> (the adults and children in all of them), with the guest's name, email and phone. A booking with several accommodations starts the first one's workflow. A booking imported from another site's calendar (Airbnb, Booking.com) has nobody to sign and starts nothing.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20bookly%3F\"><h3>Does it work with Bookly?<\/h3><\/dt>\n<dd><p>Yes, since 1.14.0, with the free Bookly (and Bookly Pro, which adds to it). Open SignSealer \u2192 Bookings. Under Bookly, the first row is every service; each service is listed under it, for any that should start a different workflow. A booking starts its agreement once it is approved: as it is made, which is Bookly's default, or, for one left pending, when you approve it, when its approve link is followed, or when it is paid for. A booking your staff add in Bookly's calendar starts one too. SignSealer emails the customer the link, and the last step of Bookly's booking form shows a button to sign. The booking fills in <code>service_name<\/code>, <code>booking_date<\/code> and <code>booking_time<\/code>, <code>persons<\/code> and <code>staff<\/code> (the staff member), with the customer's name, email and phone. Bookly Pro's recurring appointments start one agreement for the series. A booking whose time has already passed starts nothing. Bookly's free version announces nothing to other plugins, so SignSealer looks for the bookings Bookly approved as each of its requests ends; a booking made some other way, such as Bookly Pro's WooCommerce add-on, is not seen yet.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20gravity%20forms%2C%20wpforms%2C%20fluent%20forms%20or%20contact%20form%207%3F\"><h3>Does it work with Gravity Forms, WPForms, Fluent Forms or Contact Form 7?<\/h3><\/dt>\n<dd><p>Yes. Open the form's SignSealer settings, in its own plugin: Gravity Forms' form Settings, WPForms' builder Settings, Fluent Forms' Settings &amp; Integrations, or Contact Form 7's SignSealer tab (SignSealer \u2192 Forms lists every form with a link there). Choose a workflow and say which of its fields hold the email address and the name (and the last name, when the form asks for it in a field of its own). Every other blank the workflow's document asks is listed, and for each you choose the field that answers it or type the answer to use; one left with neither is asked of the person on a page of your site just before they sign. After they submit, the person is sent straight to the signing page, or the form's own confirmation gains a button to sign \u2014 your choice per form. The entry keeps the document's id, title and status, and a note on it says what was sent and what happened. Contact Form 7 keeps no entries, so there the link is carried to its own script and shown under the form's message.<\/p><\/dd>\n<dt id=\"and%20formidable%20forms%2C%20ninja%20forms%20or%20sureforms%3F\"><h3>And Formidable Forms, Ninja Forms or SureForms?<\/h3><\/dt>\n<dd><p>Yes, since 1.7.0. In Formidable Forms the settings are in the form's Settings, under SignSealer; in SureForms, in the form's Form Settings, under SignSealer, with a Save button of its own. In Ninja Forms SignSealer is an action: open the form's Emails &amp; Actions, add SignSealer, and fill in the person's email and name with merge tags, the way the form's own email is set up. Each answers the agreement's blanks and sends the person on to sign the same way as the plugins above. These three keep the entry as they always have; see who signed in SignSealer.<\/p><\/dd>\n<dt id=\"can%20they%20sign%20before%20the%20form%20is%20sent%3F\"><h3>Can they sign before the form is sent?<\/h3><\/dt>\n<dd><p>Yes, since 1.7.0. In a form's SignSealer settings, under <strong>When they sign<\/strong>, choose <strong>Before the form is sent<\/strong>. Pressing the form's own button then opens the agreement over the form, on your page; once it is signed, the form is sent by itself and its entry carries the signed document. Somebody who closes it without signing sends nothing, and no entry is kept. The check is made by your site asking SignSealer, not by the browser, so it cannot be skipped. SignSealer emails them the link as well, as it always does.<\/p><\/dd>\n<dt id=\"a%20visitor%20was%20told%20%22too%20many%20agreements%20have%20been%20started%20from%20your%20connection%22\"><h3>A visitor was told \"Too many agreements have been started from your connection\"<\/h3><\/dt>\n<dd><p>Since 1.14.4 one visitor's address may start 20 agreements an hour, before payment or from a form: enough for anybody signing their own, and a limit on a script sending your agreements to address after address. Your staff, logged in, are not counted. A form sent past the limit keeps its entry, with a note saying nothing was sent. To change the number, return another from the <code>signsealer_starts_per_hour<\/code> filter (0 for no limit). If your site is behind a proxy that does not pass the visitor's address on, every visitor looks like the proxy: return the address your proxy vouches for from the <code>signsealer_visitor_ip<\/code> filter.<\/p><\/dd>\n<dt id=\"and%20forminator%2C%20metform%2C%20everest%20forms%20or%20jetformbuilder%3F\"><h3>And Forminator, MetForm, Everest Forms or JetFormBuilder?<\/h3><\/dt>\n<dd><p>Yes, since 1.8.0. None has a place in its own screens for another plugin's settings, so a form's SignSealer settings are a page of this plugin's: open SignSealer \u2192 Forms and press Open settings beside the form. MetForm's, Everest Forms' and JetFormBuilder's lists of forms also have a SignSealer link under each form. Everest Forms and JetFormBuilder work whether a form sends with AJAX or reloads the page; a JetFormBuilder form that signs first is sent with AJAX, so the signing can open over it. Both answer the agreement's blanks, can sign before the form is sent, and send the person on to sign the same way as the others. MetForm shows its messages as plain text, so the button to sign appears under the form rather than in its message.<\/p><\/dd>\n<dt id=\"can%20wordpress%20do%20something%20different%20depending%20on%20an%20answer%3F\"><h3>Can WordPress do something different depending on an answer?<\/h3><\/dt>\n<dd><p>Yes, with Uncanny Automator (free). Make an Everyone recipe with the trigger\nSignSealer \u2192 \"A document from a form is signed\", choose the form, and choose\nthe answer it waits for, such as \"Are you married? \u2192 Yes\". Make a second\nrecipe for \"No\". Each question on the form is also a token for the recipe's\nactions. Developers can use the <code>signsealer_document_completed<\/code> action\ninstead (see For developers).<\/p><\/dd>\n<dt id=\"what%20about%20elementor%20pro%20forms%3F\"><h3>What about Elementor Pro Forms?<\/h3><\/dt>\n<dd><p>Not yet. Start here names it if it finds it on your site, with the way round it until then: give the form you want signed a public address in SignSealer, and set your form's confirmation to redirect to it (or to a page with the SignSealer agreement block). The person types their name and email again, and nothing is recorded on the entry.<\/p><\/dd>\n<dt id=\"where%20did%20settings%20%E2%86%92%20signsealer%20go%3F\"><h3>Where did Settings \u2192 SignSealer go?<\/h3><\/dt>\n<dd><p>Since 1.5.0 SignSealer has its own item in the admin menu, with Start here, Forms, WooCommerce, Templates and Settings under it. Old bookmarks to the Settings pages still work: they take you to the same page in its new place. Since 1.7.0 a form's settings are with the form, in its own plugin, and the shop's under WooCommerce \u2192 Settings \u2192 SignSealer; SignSealer's Forms and WooCommerce items take you there.<\/p><\/dd>\n<dt id=\"does%20the%20signer%20come%20back%20to%20my%20site%20afterwards%3F\"><h3>Does the signer come back to my site afterwards?<\/h3><\/dt>\n<dd><p>Yes, when your site is on https. After signing, the page offers a way back to the order they came from, or the page the form was on. SignSealer only sends people to sites a business has proven it holds, and connecting this plugin proved this one.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.17.1<\/h4>\n\n<ul>\n<li>Saving a form's SignSealer settings keeps each line of \"More blanks from\nthe form\". 1.17.0 joined them into one, so a form with two or more extra\nblanks lost them on the next Save; save it again with the lines as they\nshould be.<\/li>\n<li>Uncanny Automator: \"Any form\" means the business's forms, and no longer\nincludes documents sent from the dashboard or through the API. A third\nchoice, \"started on this site\", narrows a recipe to the documents this\nsite started itself (its form plugins' submissions, orders and bookings);\nleft as it is, a recipe hears its form wherever it was started.<\/li>\n<li>When texting waits for the business's own verified number, or the business\nis in the beta, the settings screens say so, instead of \"SignSealer could\nnot be asked\".<\/li>\n<li>The readme's example of <code>signsealer_document_completed<\/code> no longer warns on\na form without the question it reads.<\/li>\n<\/ul>\n\n<h4>1.17.0<\/h4>\n\n<ul>\n<li>A form's answers can drive what WordPress does next. When a document\ncompletes, the plugin asks SignSealer for what its signers answered, just\nafter the delivery and without storing any of it, and fires\n  signsealer_document_completed with one value per question.\n  signsealer_get_answers() asks for them on demand. A tick box is Yes or\nNo; sensitive answers are masked, as your staff see them.<\/li>\n<li>Uncanny Automator: a trigger, \"A document from a form is signed\", for\nEveryone recipes. Each question on the form you choose is a token, and the\ntrigger can wait for one answer (\"Are you married? \u2192 Yes\"), which works in\nAutomator's free edition. One recipe per answer.<\/li>\n<li>Every form the plugin handles checks its nonce before reading anything\nposted with it, including the SureForms tab and the SignSealer \u2192 Forms\npage, and posted lists are sanitized as they are read. A product's\nSignSealer settings are saved only by somebody who may edit that product.<\/li>\n<li>The plugin's scripts are written out readably, and External services now\nnames every request the plugin makes.<\/li>\n<\/ul>\n\n<h4>1.16.2<\/h4>\n\n<ul>\n<li>The page SignSealer reads to confirm the plugin is running here,\n  \/wp-json\/signsealer\/v1\/site, shows only a SHA-256 of the connection\nattempt's token, never the token itself.<\/li>\n<li>The plugin's stylesheets and scripts are files of their own, under\n  assets\/, loaded with <code>wp_enqueue_style()<\/code> and <code>wp_enqueue_script()<\/code>,\nand given what they need as data. The sign button's colour, which you\nchoose, is the one style still written on the page.<\/li>\n<li>Everything the plugin prints is escaped as it is printed. Its own pages\nin a block theme are framed by the theme's header and footer as\nWordPress itself prints them.<\/li>\n<li>A form the plugin draws for a visitor is read only once its nonce has\nbeen checked. A page left open too long is shown again to fill in.<\/li>\n<li>Bookly: the button on the last step of the booking form needs the token\nBookly's own form sends with every step.<\/li>\n<\/ul>\n\n<h4>1.16.1<\/h4>\n\n<ul>\n<li>Every form the plugin draws for a visitor, and the question an Amelia\nbooking page asks before it books, carries a nonce that is checked\nbefore anything is started. A page left open too long is shown again,\nto send once more; an Amelia page kept by a cache past its nonce lets\nAmelia book, and the agreement opens just after.<\/li>\n<li>The plugin's own pages are built as text, with no output buffer left to\nother code.<\/li>\n<li>The notice that SignSealer has ended the connection shows on the\nDashboard, the Plugins screen and SignSealer's own screens, not on\nevery admin screen; the Plugins screen's \"connect\" notice can be\ndismissed.<\/li>\n<li>SignSealer \u2192 WooCommerce has a menu address of its own, which leads to\nWooCommerce \u2192 Settings \u2192 SignSealer as before.<\/li>\n<\/ul>\n\n<h4>1.16.0<\/h4>\n\n<ul>\n<li>Amelia: pressing Book opens the agreement over Amelia's own form, and the\nbooking is made once it is signed. Bookings Amelia takes payment for on\nroutes of its own (Stripe, WooCommerce, Mollie, Razorpay) are made first,\nand the agreement opens over the page just after.<\/li>\n<li>Simply Schedule Appointments: the agreement opens over the page as soon\nas the booking is made, or on the page its form sends people to.<\/li>\n<li>Where the agreement opens just after the booking, closing it without\nsigning leaves a button to sign on the page; the email still goes, with\nthe link.<\/li>\n<li>An agreement started before an Amelia booking that is never made is\nvoided an hour later. One already signed by everyone cannot be, and\nSignSealer \u2192 Bookings says so.<\/li>\n<\/ul>\n\n<h4>1.15.0<\/h4>\n\n<ul>\n<li>A setting under SignSealer \u2192 Settings \u2192 The sign button: show a small\n\"Signed with SignSealer\" line, linking to signsealer.com, under the\nsigning button block and the <code>[signsealer_sign]<\/code> shortcode, for your own\nbusiness's forms. It is off unless you turn it on, and nothing else the\nplugin shows gets it. A business with white label is not offered it.<\/li>\n<\/ul>\n\n<h4>1.14.5<\/h4>\n\n<ul>\n<li>If SignSealer does not answer just after you connect, SignSealer's\nscreens in WordPress now ask again, at most once a minute, until this\nsite knows its business and its webhook is registered. Until now\n\"Reload to try again\" asked nothing, and the signing button and signed\nstatuses waited until the connection was forgotten and made again.<\/li>\n<li>Refreshing the connection's token keeps the business's name and address.\nThe first refresh after connecting dropped them, and from then on the\nsigning block and shortcode showed visitors nothing.<\/li>\n<\/ul>\n\n<h4>1.14.4<\/h4>\n\n<ul>\n<li>Security: a Formidable Forms answer is no longer passed through\n  maybe_unserialize(). Formidable's own decoding, which only makes\narrays, is all that runs on what a visitor typed.<\/li>\n<li>The connection's token is refreshed by one request at a time. Two at once\ncould present a refresh token SignSealer had just rotated, and SignSealer\nthen ends the connection. If SignSealer does end it, every admin screen\nnow says so, with a button to connect again.<\/li>\n<li>Agreements started by visitors -- before payment, and from a form, before\nor after it is sent -- are limited to 20 an hour from one address (the\n  signsealer_starts_per_hour filter changes it; <code>signsealer_visitor_ip<\/code>\nnames the address behind a proxy). Past it nothing is sent and no consent\nto text is recorded. A WPForms or Fluent Forms submission kept as spam\nstarts nothing.<\/li>\n<li>A webhook delivery sent again under a different event id is recognised\nas the repeat it is.<\/li>\n<li>Forgetting the connection now forgets the webhook's signing secret and any\nunfinished connection attempt too; connecting again gets the endpoint a\nnew secret by itself.<\/li>\n<li>A document's status is kept only for documents this site started, not\nfor every document the business sends.<\/li>\n<\/ul>\n\n<h4>1.14.3<\/h4>\n\n<ul>\n<li>SignSealer \u2192 Bookings says a button to sign shows on the booking plugin's\nown confirmation wherever it has room for one, not on LatePoint's alone,\nand its row for every service no longer shows an id of 0.<\/li>\n<li>The directory's screenshots are of the screens as they are now: Start\nhere, Bookings, Templates, the cart and the signing page.<\/li>\n<\/ul>\n\n<h4>1.14.2<\/h4>\n\n<ul>\n<li>Plugin Check reports nothing at any severity, with every category, error\nand warning included: JetFormBuilder's sign-first refusal is thrown in\nplain steps (written as one expression, it stopped the escaping check),\nand Amelia's services are read with the table as a query placeholder.<\/li>\n<\/ul>\n\n<h4>1.14.1<\/h4>\n\n<ul>\n<li>Start here has a card of its own for each of Amelia, LatePoint and Simply\nSchedule Appointments, each linking its own step-by-step guide, where one\ncard used to stand for the three.<\/li>\n<li>Elementor Pro Forms is named as not supported, rather than not supported\nyet, with MetForm, which works with Elementor, as the way to sign from an\nElementor site.<\/li>\n<\/ul>\n\n<h4>1.14.0<\/h4>\n\n<ul>\n<li>Bookly. Its services are set up on SignSealer \u2192 Bookings: one row for\nevery service, and one for each. A booking starts its agreement once it\nis approved (as it is made, by Bookly's default, or later by you, its\napprove link or a payment), with the service, the date and time, how\nmany people and the staff member filled in, and the last step of\nBookly's booking form shows a button to sign.<\/li>\n<\/ul>\n\n<h4>1.13.0<\/h4>\n\n<ul>\n<li>MotoPress Hotel Booking. Its accommodation types are set up on SignSealer\n-&gt; Bookings: one row for every type, and one for each. A booking starts\nits rental agreement once it is confirmed (by the guest's email link, by\nyou, or by a payment), with the check-in date and time, the check-out\ndate, the nights and everybody staying filled in, and its Booking\nConfirmed page shows a button to sign. Imported bookings start nothing.<\/li>\n<\/ul>\n\n<h4>1.12.0<\/h4>\n\n<ul>\n<li>FluentBooking. Its event types are set up on SignSealer \u2192 Bookings: one\nrow for every event type, and one for each. A booking starts its\nagreement once it is scheduled (booked, added by the host, or confirmed\nor paid after waiting), with the event type, the date and time in the\ncalendar's zone, the host and an in-person place filled in, and\nFluentBooking's confirmation shows a button to sign.<\/li>\n<\/ul>\n\n<h4>1.11.0<\/h4>\n\n<ul>\n<li>Booking Calendar. Under SignSealer \u2192 Bookings, choose the workflow every\nbooking starts. Whoever booked is emailed the link to sign, with the date\n(and time, for a time slot), how many people, and their name, email and\nphone from its form, and Booking Calendar's own message after booking\nshows a button to sign. Both its default form and the one it made before\n10.x are read.<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li>Events Manager. Its events are set up on SignSealer \u2192 Bookings: one row\nfor every event, and one for each event to come. A booking starts one\nagreement for whoever booked, for the spaces they took, with the event's\nname, date, time, location and tickets filled in, and Events Manager's\nown message after booking shows a button to sign. A booking waiting for\napproval starts it; one waiting on a payment starts it once approved; a\nrejected or cancelled one starts nothing.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Event Tickets. Its RSVPs and Tickets Commerce's tickets are set up on\nSignSealer \u2192 Bookings: one row for every ticket and RSVP, and one for each\nticket of the events to come. Whoever booked is emailed the link to sign,\none agreement for each ticket in their order, and the event fills in its\nname, date, time, venue, organizer and how many people. The RSVP's message\nand the order page show a button to sign. An RSVP of \"not going\" starts\nnothing, and a paid ticket starts its agreement once it is paid. RSVPs\nmade the way Event Tickets did before 5.30 work too.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Forminator and MetForm. A form's SignSealer settings are a page of this\nplugin's, reached from SignSealer \u2192 Forms (and, for MetForm, from a\nSignSealer link under each form in its list). Each can sign before the\nform is sent, or after: straight to the signing page, or a button to\nsign. MetForm's messages are plain text, so its button appears under the\nform. Until now Start here called both \"not supported yet\".<\/li>\n<li>Everest Forms and JetFormBuilder, the same way, with a SignSealer link\nunder each form in their lists; with AJAX or without. A JetFormBuilder\nform that signs first is sent with AJAX. Start here now names only\nElementor Pro Forms as not supported yet.<\/li>\n<li>Amelia, LatePoint and Simply Schedule Appointments. Under the new\n<strong>SignSealer \u2192 Bookings<\/strong>, choose the workflow a booking of each service\nstarts. The person who booked is emailed the link to sign; the booking\nfills in the service, the date and time, how many people, who runs it and\nwhere, and the owner chooses or types the answer to anything else the\nagreement asks. LatePoint's confirmation step shows a button to sign. A\nbooking saved again starts nothing a second time.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>A form's <strong>What the agreement asks<\/strong> now lists the boxes on an uploaded\nPDF that the sender fills in, such as the equipment and the pickup and\nreturn dates on a rental agreement, matched to the form's fields of the\nsame name. Before, they were not listed, and the start was refused unless\nthey were typed under <strong>More blanks from the form<\/strong>. Needs SignSealer's\nlist of a workflow's sender boxes (00478).<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>A form's SignSealer settings are with the form, in its own plugin:\nGravity Forms' form Settings, WPForms' builder Settings, Fluent Forms'\nSettings &amp; Integrations, and Contact Form 7's editor, each under\nSignSealer. <strong>SignSealer \u2192 Forms<\/strong> lists every form, what it starts and a\nlink to its settings. Nothing you had set up changes.<\/li>\n<li>The shop's settings are under <strong>WooCommerce \u2192 Settings \u2192 SignSealer<\/strong>, beside\nWooCommerce's own; SignSealer \u2192 WooCommerce takes you there, and so do old\nbookmarks.<\/li>\n<li>A template that asks for something the plugin does not fill no longer stops\nthe signing with SignSealer's \"\u2026 is required\". The plugin reads the blanks\neach workflow asks from SignSealer:\n\n<ul>\n<li>a form's settings list them, each with the field that answers it (the one\nthat looks like it is chosen for you) or an answer to use every time, and\nsay which are not answered yet;<\/li>\n<li>a product's agreement lists them, each with a box the shop fills in or\nleaves for the customer;<\/li>\n<li>before payment the signing page asks the customer for the rest, beside\ntheir name and email; and once they have signed in its frame, it moves\non by itself, without their pressing \"I have signed it\";<\/li>\n<li>after payment, an order whose agreement still needs something waits for\nthe customer: its Sign link opens a page of your site that asks, then\nstarts the agreement and goes on to sign it. The order notes say so.<\/li>\n<\/ul><\/li>\n<li>Formidable Forms, Ninja Forms and SureForms. Formidable's settings are in a\nform's Settings, SureForms' in a tab of its Form Settings, and Ninja Forms\nhas a SignSealer action beside a form's email and success message, its\ndetails filled in with merge tags.<\/li>\n<li>A form whose agreement asks something the form does not is no longer\nrefused: the person is asked for it on a page of your site, just after\nsubmitting, and the agreement starts once they answer. \"Nothing here\" for\nsuch a form shows the link to that page in the form's confirmation.<\/li>\n<li>A form that asks for the first and last name separately names the person by\nboth: choose the second as the <strong>Last name field<\/strong>.<\/li>\n<li>A form can sign before it is sent, in all seven form plugins: pressing its\nbutton opens the agreement over the form, and the form is sent once it is\nsigned, its entry carrying the signed document. Nobody who does not sign\nleaves an entry. Your site asks SignSealer whether it is signed before it\naccepts the form.<\/li>\n<li>The link to sign in a form's confirmation, on the thank-you page and on the\nsigning button is a button, with room around it: SignSealer blue, a colour\nof your own, or your theme's buttons (SignSealer \u2192 Settings).<\/li>\n<li>WPForms: a form made from one of WPForms' templates and not saved since\nshowed an empty SignSealer section. It shows its settings.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Tells WooCommerce that the plugin works with the block cart and checkout,\nwhich it already did: the order hook, the refusal of an unsigned order,\nthe \"text me\" box and the cart's button each have a block half. WooCommerce\nno longer marks the plugin incompatible on the Features screen or offers to\nswitch your shop back to the classic checkout because of it.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>With agreements signed before payment, the cart's checkout button reads\n\"Sign the agreement\" and goes to the signing while anything is unsigned,\non the classic cart and the cart block alike. The checkout page itself\nsends a customer back to the signing rather than letting them fill in a\nform that cannot be placed. The checkout still refuses an unsigned order.<\/li>\n<li>The signing page before payment is drawn in the theme's own header and\nfooter on a block theme, and has a look of its own: a list of what needs\nsigning, a card for who is signing, labelled fields and proper buttons.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>An order or a form entry no longer goes back to \"draft\" just after its\nagreement was sent. SignSealer raises a document's creation and its\nsending in the same instant, and the two can reach your site in either\norder; the plugin now keeps \"sent\" from the moment it sends, and\n\"signed\" once it has been told so at checkout, so a delivery behind\neither is not believed and no \"is now draft\" note is added.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>The link can go by text as well as email. When your SignSealer plan\nincludes texting, WooCommerce can ask at checkout whether the customer\nwants the link by text (SignSealer, WooCommerce), and each form under\nSignSealer, Forms can name a tick box as its texting consent field. A\nticked box, and the phone number given, are recorded at SignSealer as the\nperson's consent, in the words beside the box, before the agreement is\nsent, so the first text can go.<\/li>\n<li>Nothing to be texted is offered when the business cannot text: on a plan\nwithout texting, or on a test account. The screens say which.<\/li>\n<li>The words to put beside the box come from SignSealer: the opt-in wording\nyour business declared, or the one the carriers approved on SignSealer's\nown forms, with your business's name.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>The thank-you page asks for the signature once, near the top. On a block\ntheme (such as Twenty Twenty-Five) the \"One more step\" box came last, after\nthe addresses, with a smaller list of the same documents above it; it now\ntakes that list's place under the order.<\/li>\n<li>The Sign buttons on your site (the thank-you page, the block and the\nshortcode) are styled by block themes as well as classic ones. On a block\ntheme they were plain links.<\/li>\n<li>The block's preview in the editor looks like the button your visitors\nwill see, rather than a greyed-out one.<\/li>\n<li>The order's SignSealer box says Signed, Waiting for a signature, Declined\nand so on as a coloured status.<\/li>\n<li>Tidier cards on Start here: a status no longer wraps oddly under a long\nname, and a card's button and guide link no longer touch.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>SignSealer has its own item in the admin menu, with Start here, Forms,\nWooCommerce, Templates and Settings under it, instead of three entries\nunder Settings. Old Settings addresses still work: they go to the same\npage in its new place, and a connection that was halfway through when you\nupdated still finishes.<\/li>\n<li><strong>Start here<\/strong>: what SignSealer does, whether this site is connected, and\na card for every integration \u2014 WooCommerce, WooCommerce Bookings, Gravity\nForms, WPForms, Fluent Forms, Contact Form 7 and the signing button \u2014 that\nsays whether its plugin is on this site, whether it is set up, and the\nthree steps to set it up, with a link to a step-by-step guide. Form\nplugins it does not work with yet are named, with the way round it.<\/li>\n<li><strong>SignSealer \u2192 Forms<\/strong> is always in the menu, and explains itself; a site\nwith none of the supported form plugins is told which ones work. The\nWooCommerce choice moved to its own page, which also lists the products\nthat need an agreement.<\/li>\n<li>Connecting: coming back from SignSealer no longer shows \"That connection\nattempt has expired\" under \"Connected\" when the page loads twice, and a\nreload after connecting shows the connection rather than an error.\nPressing Connect again after an attempt that did not finish reuses the\napplication the first press registered instead of registering another.\nTurning down the connection on SignSealer's screen now says so. Somebody\nmaking their SignSealer account while connecting has thirty minutes\nrather than five.<\/li>\n<li>A link to Start here and Settings beside Deactivate on the plugins screen,\nand a one-line pointer there until the site is connected.<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Deleting the plugin now removes everything it stored. Until now it left\nthe form mappings, the WooCommerce trigger setting, the links from each\nagreement back to its order or form entry, and a few short-lived caches\nin the database after the plugin itself was gone. Notes and agreement ids\non your WooCommerce orders and form entries stay: they are part of those\norders' and entries' history.<\/li>\n<li>That includes sites with a persistent object cache (Redis, Memcached),\nwhere cached copies are now removed along with the stored ones, and every\nsite of a multisite network, not only the one it was deleted from.<\/li>\n<li>An agreement's status can no longer go backwards. SignSealer's notices\nabout one agreement can arrive out of order (they are sent in parallel and\nretried), and a late \"sent\" arriving after \"signed\" set the agreement back\nto waiting: the WooCommerce order and the form entry asked for a signature\nthat had already been given, and gained a note saying so. The newest\nstatus now wins, by when it happened.<\/li>\n<li>Checked by deleting the plugin from a real WordPress, with a persistent\nobject cache on, from a single site and from a network, in the test\nsuite, and by scanning every file for code PHP 7.4 cannot run.<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Gravity Forms: \"Send them straight to the signing page\" and \"Show the\nform's own confirmation, with a link to sign\" now happen. The plugin\nstarted the agreement from <code>gform_after_submission<\/code>, which Gravity Forms\nruns only after it has decided what the visitor sees, so the visitor got\nthe form's usual confirmation and had to find the link in SignSealer's\nemail. It now starts the agreement as soon as the entry is saved, before\nthe confirmation is chosen.<\/li>\n<li>Gravity Forms: a submission Gravity Forms marks as spam no longer starts\nan agreement. Until now a bot's submission sent a real signing request to\nwhatever address it typed.<\/li>\n<li>Checked against the real Gravity Forms, with forms submitted through its\nown submission process, rather than only against a stand-in for it.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>WooCommerce can ask for the signature before payment. With \"Before\npayment\" chosen under Settings -&gt; SignSealer, a customer whose cart holds\na product that needs an agreement signs it on a page of your site, in a\nframe, and the classic checkout and the checkout block will not place the\norder until SignSealer says it is signed. The order then carries that\ndocument instead of starting another.<\/li>\n<li>The connection asks for four scopes, not five: the plugin lists templates\nand never changes one, so it no longer asks to.<\/li>\n<li>SignSealer's own sentence is shown when it refuses something. Until now\nthe plugin read the wrong part of the answer and showed only the status.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Reconnecting a site no longer registers a second webhook endpoint. The\ncheck for the one already there read the wrong key in SignSealer's answer,\nso it never found it, and each reconnect added an endpoint that delivered\nevery event again.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>The block's editor script now declares what it needs and carries the\nplugin's version. Without that, a browser kept the previous release's\neditor script until WordPress itself updated, and the block's own words\nin the editor could never be translated, because WordPress only sets up\na script's translations when it depends on <code>wp-i18n<\/code>.<\/li>\n<li>Checked against WordPress 7.1.2 with the directory's Plugin Check (every\ncategory, low severity included: nothing found), the block loaded in the\neditor with no console errors, and the WooCommerce, WPForms, Fluent Forms\nand Contact Form 7 integrations driven end to end.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li><strong>Connecting is one button.<\/strong> The settings screen asked for an application\nid and secret, and nothing a site owner could reach issued them. Now the\nplugin registers itself: it mints a one-time token, serves it at\n  \/wp-json\/signsealer\/v1\/site, and SignSealer fetches that page over https\nto confirm the plugin is running here before registering an application\nnamed after this site. Press Connect, sign in, approve, done. A partner\nwith an application of their own can still paste it, under a fold.<\/li>\n<li>The screen says plainly when the site is not on https, since that is the\none thing that stops the connection.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li><strong>WooCommerce Bookings.<\/strong> A booking the shop confirms starts its agreement\nat once, paid or not; a paid booking starts it under the \"paid\" trigger.\nThe booking's date, time, number of people and resource go to the\ntemplate, and the booking's own screen shows where the agreement stands.<\/li>\n<li><strong>Contact Form 7.<\/strong> The fourth form plugin on Settings \u2192 SignSealer forms.\nIts fields are listed by tag name; a sent submission starts the workflow;\nthe signing link rides on the form's own answer to a small script that\nsends the person on or adds the link under the message, with the address\nin the message itself when the form is submitted without its script.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li><strong>WooCommerce.<\/strong> A product can need an agreement; the order starts it when\npaid or when placed, offers it on the thank-you page, in the customer's\norder email and under My Account, and carries its status on the order\nscreen and in the order notes. Compatible with WooCommerce's own order\ntables (HPOS).<\/li>\n<li><strong>Gravity Forms, WPForms and Fluent Forms.<\/strong> One screen under Settings maps\na form to a workflow: the email, name and phone fields, template blanks\nfilled from fields, and whether the person is sent straight to the signing\npage or given a link in the confirmation. The entry keeps the document and\nits status, with a note for what was sent and what happened.<\/li>\n<li><strong>The way back.<\/strong> A document started here carries the page to return the\nsigner to \u2014 the order, or the page the form was on \u2014 which SignSealer\nhonours because this site is the one the connection was made on. Needs\nhttps; on http the signed page simply has no button.<\/li>\n<li>A <code>signsealer_woocommerce_participant<\/code> filter and a\n  signsealer_form_participant filter, for a site that keeps a template's\nblank somewhere the plugin cannot guess.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li><strong>The settings screen told you to do something that cost money.<\/strong> It said\n\"In SignSealer under Developers \u2192 Webhooks, add this address\" on a screen\nwhere connecting had already added it. Following that made a second endpoint\nfor the same address, and two endpoints deliver every event twice and are\ncounted twice. It now says it is registered, says not to add another, and\nkeeps the manual form for the one case it is for.<\/li>\n<li><strong>The templates screen said you had no forms when it could not ask.<\/strong> If the\nAPI did not answer, the screen showed the error and then both tables saying\n\"None yet. Make one in SignSealer under Workflows\" \u2014 so a business with forty\nforms was told it had none and invited to make them again. A failure now\nreplaces the tables rather than captioning them.<\/li>\n<li><strong>A connection with no application behind it reported itself as connected.<\/strong>\nRefreshing a token needs the application id and secret beside the refresh\ntoken; without them the plugin emitted two PHP notices, posted an empty\n  client_id, and put the API's answer \u2014 \"client_id is required\" \u2014 at the top\nof an admin screen. Such a connection is now simply not a connection, and the\nscreen offers connecting again.<\/li>\n<li><code>wp_safe_redirect<\/code> with an <code>allowed_redirect_hosts<\/code> filter on the OAuth\nhand-off, fenced to the host <code>SIGNSEALER_API_BASE<\/code> resolves to.<\/li>\n<li>Tested up to WordPress 7.1. Translation template added.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release. OAuth connection, a self-registering and verified webhook receiver, the templates and forms screen, a block and a shortcode.<\/li>\n<\/ul>","raw_excerpt":"Send waivers and agreements from WordPress, and see who has signed. Signing happens on SignSealer; this site keeps ids and status, never evidence.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/380014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=380014"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mashdunllc"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=380014"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=380014"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=380014"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=380014"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=380014"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=380014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}