What you have to update: the Signer fields (the boxes that tell Scrive who is signing). Every time the template is copied, these get brand-new internal codes, and the Code action needs to be pointed at the new codes. If you skip this, the signing invites go out empty and the journey stops with an error.
💡 Good news: the webhook (the link Scrive uses to tell your journey "everyone has signed") is set up once for your whole company. You normally do not need to change it for each new journey — just double-check it in Step 1.
Step 1: Check the webhook in the "Wait" step
The "Wait" step is what pauses your journey until everyone has signed. It already has a webhook link built in. You just need to check it's there and copy it.
In your journey, click the step called "Wait until all signers have signed".
Look for the webhook link. It looks something like this:
https://journeys-api.50skills.app/v1/webhooks/ERpPAy2gO/
In most cases this link is already filled in, because it's shared across your whole company's signing setup. If it's there, you're good — just copy it, you'll need it in Step 3.
Step 2: Check the Code action's Inputs
Before editing the code, look at the Inputs list (just above "Open code editor"). This is the set of values the Code action is allowed to use — and it's where each Signer field's code comes from.
For this template it should contain all seven:
Traveller • Signer 1 email
Traveller • Signer 1 first name
Traveller • Signer 1 last name
Traveller • Signer 2 email
Traveller • Signer 2 first name
Traveller • Signer 2 last name
Create a new document in Scrive • Signatory Id (this is the sender/author, so they can watch the document)
When you copy the template, make sure all of these are present and pointing at the new journey's fields. If one is missing or points at the wrong field, that signer's name/email arrives empty — even if the code line looks correct.
The Output is called "JSON payload" — that's what you connect to the "Add signers" Document field in Step 4.
Step 3: Update the Signer codes in the Code action
This is the one part you must do every time you make a new journey. The Code action is a little box that builds the message sent to Scrive (who should sign, and where to send the "all done" notification). It can't read the Signer fields directly, so you have to tell it the new codes by hand.
Open the Code action (the step named "Add signers and callback URL" uses it).
Open the Variables panel. This is a list on the side that shows each Signer field with a friendly name — like "Signer 1 email", "Signer 1 first name", and so on — next to its code. For each Signer field, find the matching line in the code below and swap in the code shown in the Variables panel. In other words: the code panel says "Signer 1 email = ABC123", so you put ABC123 on the "Signer 1 email" line in the code. Do this for all of them.
Then paste the webhook link you copied in Step 1 onto the "api_callback_url" line (it's near the top of the code).
Here is the code. The only things you touch are the random …__value and the webhook link — leave everything else exactly as it is:
def process(**kwargs):
"""
Returns:
json_string (text): JSON payload
"""
signer_1_email = kwargs.get("journey_attribute__Mrm1q7Mmo__value") or ""
signer_1_first_name = kwargs.get("journey_attribute__EN9VoG6Pz__value") or ""
signer_1_last_name = kwargs.get("journey_attribute__wzPbaJg9v__value") or ""
signer_2_email = kwargs.get("journey_attribute__QaPyQ7KP2__value") or ""
signer_2_first_name = kwargs.get("journey_attribute__gYBj5EVmj__value") or ""
signer_2_last_name = kwargs.get("journey_attribute__1V9nXEYma__value") or ""
author_party_id = kwargs.get("AaLW5gJxz__response_data__viewer__signatory_id") or ""
document_payload = {
"api_callback_url": "https://journeys-api.50skills.app/v1/webhooks/ERpPAy2gO/",
"parties": [
{
"id": author_party_id,
"signatory_role": "viewer"
},
{
"signatory_role": "signing_party",
"sign_order": 1,
"delivery_method": "email",
"fields": [
{"type": "email", "value": signer_1_email},
{"type": "name", "order": 1, "value": signer_1_first_name},
{"type": "name", "order": 2, "value": signer_1_last_name}
]
},
{
"signatory_role": "signing_party",
"sign_order": 2,
"delivery_method": "email",
"fields": [
{"type": "email", "value": signer_2_email},
{"type": "name", "order": 1, "value": signer_2_first_name},
{"type": "name", "order": 2, "value": signer_2_last_name}
]
}
]
}
return {
"json_string": json.dumps(document_payload)
}
⚠️ If you skip this: the signing invites go out with no name or email, and the journey stops with an error (invalid_invitation_delivery_info). If that happens, come back and re-check the codes.
Step 4: Connect the Code action to the signing step
Last, tell the signing step to use what the Code action built. This is usually already set up in the template, but it's worth a quick check.
Open the "Add signers and callback URL" step.
In its Document field, choose the Code action's "JSON payload" output.
In its Document Id field, choose your document_id.
If something goes wrong
The signing invite goes out blank, or the journey shows an error.
The codes in the Code action don't match this journey. Go back to Step 3, open the Variables panel, and make sure every Signer field's code matches its line in the code.
Everyone signed, but the journey is stuck on the "Wait" step.
The webhook link is missing or wrong. Check Step 1 — make sure the link is in the Wait step and that the same link is on the api_callback_url line in the code. Also confirm the step continues only when signing is fully finished (document_signed_and_sealed = true).
And you're done! 🎉




