We would like to gather data that informs our decision on a Argo Contentful integration. We have a POC Argo integration with GitLab. Now we need to explore what that would look like if we integrate directly with Contentful. From there, we can make a informed decision.
Please provide more information related to this request
Make sure the information you provide is relevant for your request. If unsure, please provide all the fields. Add/remove rows as needed.
If this is urgent, what is the business need for the urgency?
Yes: what is the business need for the urgency
No However, we should have a clear understanding of where and how to plug Argo into our marketing tech stack for a continuous localization system by the end of Q3
If the requestor is not the DRI, find out if the DRI is aware of the request / wants to change things.
Does anyone in leadership have eyes on this project?
@meganfilo When we provide the JSON outputs for our Next Step and Nav contents, lets include the ones received thru an API call. We should also document what those API calls are and the resulting JSON delivery.
@jariasc-ext was demoing this for me and it the outputs look different from the JSON viewer in Contentful versus an API call. I assume an ARGO integration would be using a API.
@meganfilo I'll leave it up to you for determining the best format to share these JSON deliveries with @opysaryuk. Could be right in this issue, a doc, code . . . it's up to you!
I would gladly take the demo, too, @jariasc-ext ! , and the JSON files, and chat about the structure within. Browsing both spaces, I can see the veiwer for field level in Next Steps, and wondering what entry level files would look like.
Using field-level localization, we only need one entry for our test hero content type. One entry, 4 locale fields for each content field needed. Because of that, I used the following code:
{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"2SXOXehfVYDBYYqgPmF2rj","type":"Entry","createdAt":"2023-10-03T13:46:49.932Z","updatedAt":"2023-10-03T13:52:54.442Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"testFieldEntryLocalizationHero"}}},"fields":{"header":{"de-DE":"Software. Schneller.","en-US":"Software. Faster.","fr-FR":"Logiciel plus rapide","ja-JP":"ソフトウェア。もっと早く。"},"subtitle":{"de-DE":"Bringen Sie Geschwindigkeit und Sicherheit auf einer einzigen Plattform in Einklang","en-US":"Balance speed and security in a single platform","fr-FR":"Équilibrez vitesse et sécurité sur une seule plateforme","ja-JP":"\n単一プラットフォームでスピードとセキュリティのバランスをとる"},"description":{"de-DE":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"Automatisieren Sie die Softwarebereitstellung, steigern Sie die Produktivität und sichern Sie Ihre End-to-End-Softwarelieferkette.","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"},"en-US":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"Automate software delivery, boost productivity, and secure your end-to-end software supply chain.","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"},"fr-FR":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"Automatisez la livraison de logiciels, augmentez la productivité et sécurisez votre chaîne d'approvisionnement logicielle de bout en bout.","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"},"ja-JP":{"nodeType":"document","data":{},"content":[{"nodeType":"paragraph","data":{},"content":[{"nodeType":"text","value":"\nソフトウェア配信を自動化し、生産性を向上させ、エンドツーエンドのソフトウェア サプライ チェーンを保護します。","marks":[],"data":{}}]}]}},"content":{"de-DE":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"iVzdsYlgRHMnxIXae8AN1","type":"Entry","createdAt":"2023-10-03T13:51:31.833Z","updatedAt":"2023-10-03T13:51:36.905Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"German Test Link"},"text":{"en-US":"This is where the german text would go for this test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}],"en-US":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1Tjk0Ngu5aKPjLezQntPLa","type":"Entry","createdAt":"2023-10-03T13:46:46.028Z","updatedAt":"2023-10-03T13:46:46.028Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"Test Link"},"text":{"en-US":"This is a test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}],"fr-FR":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"4sxObZgs9tGSP9vTAI6N6S","type":"Entry","createdAt":"2023-10-03T13:50:40.385Z","updatedAt":"2023-10-03T13:51:43.722Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"French Test Link"},"text":{"en-US":"test text for french link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}],"ja-JP":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1D4uteW1U73CyT3GCicmHF","type":"Entry","createdAt":"2023-10-03T13:52:50.169Z","updatedAt":"2023-10-03T13:52:50.169Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"Japanese test link"},"text":{"en-US":"This would be japanese text in this test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}]}}}
If I wanted to grab the FRENCH content only, the call and output would look like this:
{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"2SXOXehfVYDBYYqgPmF2rj","type":"Entry","createdAt":"2023-10-03T13:46:49.932Z","updatedAt":"2023-10-03T13:52:54.442Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"testFieldEntryLocalizationHero"}},"locale":"fr-FR"},"fields":{"header":"Logiciel plus rapide","subtitle":"Équilibrez vitesse et sécurité sur une seule plateforme","description":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"Automatisez la livraison de logiciels, augmentez la productivité et sécurisez votre chaîne d'approvisionnement logicielle de bout en bout.","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"},"content":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"4sxObZgs9tGSP9vTAI6N6S","type":"Entry","createdAt":"2023-10-03T13:50:40.385Z","updatedAt":"2023-10-03T13:51:43.722Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}},"locale":"fr-FR"},"fields":{"internalName":"French Test Link","text":"test text for french link","href":"/solutions","isOneTrustButton":false}}]}}
Entry JSON
Entry-level localization requires us to create a new content entry for each locale. If a 'Page' content type has a Hero, Text, and Button reference in it, you would need 1 page, 4 entries for Hero, 4 entries for Text, and 4 entries for Button. Each entry would have it's own ID, as opposed to field-level which keeps all fields under one ID.
My Hero content type test is smaller and isn't a great example of how complex this could get, but here is the JSON output for gathering ALL of those locales.
{"sys":{"type":"Array"},"total":4,"skip":0,"limit":100,"items":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1fmpq5zMzvnH7YihOjUlYk","type":"Entry","createdAt":"2023-10-03T14:20:07.680Z","updatedAt":"2023-10-03T14:21:13.484Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"testEntryLocalizationHero"}}},"fields":{"header":{"en-US":"Software. Schneller."},"subtitle":{"en-US":"Bringen Sie Geschwindigkeit und Sicherheit auf einer einzigen Plattform in Einklang"},"description":{"en-US":{"nodeType":"document","data":{},"content":[{"nodeType":"paragraph","data":{},"content":[{"nodeType":"text","value":"Automatisieren Sie die Softwarebereitstellung, steigern Sie die Produktivität und sichern Sie Ihre End-to-End-Softwarelieferkette.","marks":[],"data":{}}]}]}},"content":{"en-US":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"iVzdsYlgRHMnxIXae8AN1","type":"Entry","createdAt":"2023-10-03T13:51:31.833Z","updatedAt":"2023-10-03T13:51:36.905Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"German Test Link"},"text":{"en-US":"This is where the german text would go for this test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}]}}},{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"2DSAbdjTKufLoEPnHpe4Wm","type":"Entry","createdAt":"2023-10-03T14:20:50.200Z","updatedAt":"2023-10-03T14:20:50.200Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"testEntryLocalizationHero"}}},"fields":{"header":{"en-US":"ソフトウェア。もっと早く。"},"subtitle":{"en-US":"\n単一プラットフォームでスピードとセキュリティのバランスをとる"},"description":{"en-US":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"\nソフトウェア配信を自動化し、生産性を向上させ、エンドツーエンドのソフトウェア サプライ チェーンを保護します。","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"}},"content":{"en-US":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1D4uteW1U73CyT3GCicmHF","type":"Entry","createdAt":"2023-10-03T13:52:50.169Z","updatedAt":"2023-10-03T13:52:50.169Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"Japanese test link"},"text":{"en-US":"This would be japanese text in this test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}]}}},{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"2RK9oXR1vSY2eGAELARn92","type":"Entry","createdAt":"2023-10-03T14:19:22.914Z","updatedAt":"2023-10-03T14:19:22.914Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"testEntryLocalizationHero"}}},"fields":{"header":{"en-US":"Logiciel plus rapide"},"subtitle":{"en-US":"Équilibrez vitesse et sécurité sur une seule plateforme"},"description":{"en-US":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"Automatisez la livraison de logiciels, augmentez la productivité et sécurisez votre chaîne d'approvisionnement logicielle de bout en bout.","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"}},"content":{"en-US":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"4sxObZgs9tGSP9vTAI6N6S","type":"Entry","createdAt":"2023-10-03T13:50:40.385Z","updatedAt":"2023-10-03T13:51:43.722Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"French Test Link"},"text":{"en-US":"test text for french link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}]}}},{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"4jcSGNI71XxT6HvTQmECNg","type":"Entry","createdAt":"2023-10-03T14:18:17.380Z","updatedAt":"2023-10-03T14:18:17.380Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"testEntryLocalizationHero"}}},"fields":{"header":{"en-US":"Software. Faster"},"subtitle":{"en-US":"Balance speed and security in a single platform"},"description":{"en-US":{"data":{},"content":[{"data":{},"content":[{"data":{},"marks":[],"value":"Automate software delivery, boost productivity, and secure your end-to-end software supply chain.","nodeType":"text"}],"nodeType":"paragraph"}],"nodeType":"document"}},"content":{"en-US":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1Tjk0Ngu5aKPjLezQntPLa","type":"Entry","createdAt":"2023-10-03T13:46:46.028Z","updatedAt":"2023-10-03T13:46:46.028Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"Test Link"},"text":{"en-US":"This is a test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}]}}}],"includes":{"Entry":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1D4uteW1U73CyT3GCicmHF","type":"Entry","createdAt":"2023-10-03T13:52:50.169Z","updatedAt":"2023-10-03T13:52:50.169Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"Japanese test link"},"text":{"en-US":"This would be japanese text in this test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}},{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"1Tjk0Ngu5aKPjLezQntPLa","type":"Entry","createdAt":"2023-10-03T13:46:46.028Z","updatedAt":"2023-10-03T13:46:46.028Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":1,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"Test Link"},"text":{"en-US":"This is a test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}},{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"4sxObZgs9tGSP9vTAI6N6S","type":"Entry","createdAt":"2023-10-03T13:50:40.385Z","updatedAt":"2023-10-03T13:51:43.722Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"French Test Link"},"text":{"en-US":"test text for french link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}},{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"g1m12f5de7m9"}},"id":"iVzdsYlgRHMnxIXae8AN1","type":"Entry","createdAt":"2023-10-03T13:51:31.833Z","updatedAt":"2023-10-03T13:51:36.905Z","environment":{"sys":{"id":"master","type":"Link","linkType":"Environment"}},"revision":2,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"navigationLink"}}},"fields":{"internalName":{"en-US":"German Test Link"},"text":{"en-US":"This is where the german text would go for this test link"},"href":{"en-US":"/solutions"},"isOneTrustButton":{"en-US":false}}}]}}
If you needed the individual FR/DE/JA entry, you would need to use:
The JSON output from Contentful is full of nesting and fields that really do not need to be shared with translators. Likewise, it takes a lot of lining up to get translated JSON back into Contentful. Using GraphQL queries instead of REST API calls could help with this, but this is still NOT ideal when you have a lot of references (content types within content types). In some aspects, this really would be more efficient if we gave our translators access to Contentful.
I know we may have had the idea to push code to Argo > send to Translated + Argo gets code back from Translated > Argo pushes to Contentful. There might be ways we would not even need Argo if we utilize Contentful workflows.
I think the best experience for everyone (translators, content authors, developers, etc), would be to fire a webhook via Contentful any time English content is published or republished. This fires off to Argo the url of the entry or entries (because a single PAGE entry can be built of multiple reference entries). Translated gets this ticket/request, clicks on the URL, and they are taken to that entry in Contentful to add content in that language.
The Translator could start a Workflow for that entry and that's the end of it (on our side, we would review that content and hit Publish), OR... I don't know what Argo looks like for Translated's side, but we could fire off another Contentful webhook (the create workflow hook) that takes the url of that entry/entries and sends it to Argo. From there, we can just find the right method to make us aware of this workflow to review the content and hit publish. This could be an automated Slack message, create an issue in GitLab, or tag the appropriate parties in a comment in that workflow.
^ All that said, I believe it is in our best interest to keep Translated away from the code. This eliminates having to tell them which fields to not translate AND this eliminates developers having to go in and troubleshoot a 500+ line JSON object that has something breaking the Contentful content API, and this gives us the flexibility to use Argo or not.
@opysaryuk I know we are waiting back to hear from Translated on their thoughts of the JSON files, but our discussion on GraphQL sent me down a little bit of a rabbit hole on Contentful capabilities!
There might be ways we would not even need Argo if we utilize Contentful workflows.
The Translator could start a Workflow for that entry
the right method to make us aware of this workflow to review the content
I realize I am not familiar with the concept of a workflow in Contentful, or how what kind of user persona (in our case, the proposed persona of a Translator?) would use what workflows, for what content types, with what defined steps, under what permissions granularity, etc. Would love a demo on some real use case of translating a piece of content.
Hi, @meganfilo. Thanks so much for your work and solutioning on this with Oleks. I reviewed the ticket and while I think Contentful will make it easier for a content manager or copywriter to make edits to translations or assume the full scope of work for a particular element, it will not replace the other tools that linguist rely on to be more effective, efficient, accurate, and consistent in their work; it also will not replace the need for Argo. I would like to see this workflow on a call with you, and hope you do not mind if I grab some time on your calendar. I want to bring Oleks and one of our suppliers, so we can get their feedback as well.
I am also not convinced that we should move away from content being managed in GitLab from where we push content into Contentful. We should also be mindful of how hard would it be for us to move off Contentful in a few years, if a better solution is available to us.
Hi @djsulliv - Happy to meet and talk this over. I do want to point out that we are still actively moving English content into the CMS and DEX still doesn't have the way we are organizing content set in stone, nor have we been planning to set up any workflows right now. We are learning as we go and I believe we will be spending Q4 to take time creating our best practices. That said, I'm happy to get a test/hypothetical workflow created to see how this might look! Just not sure if I will have a fully fledged out workflow demonstration for you!
Is there any content that has been moved to Contentful by now, that had been translated via the yml file exchange process, and that had been updated in English in Contentful (or will be soon) that would require to reflect the corresponding English updates in non-English? It would be great to use something like that as an example, around which to discuss the proposed process. Or, if not available, then a hypothetical workflow should be good.
Is the recording of Contentful training ('Content Operations' being latest) the right place to learn about Contentful's concept of workflows?
@opysaryuk - We are moving very fast with the content migration that it's hard to tell. We have this spreadsheet that is tracking our process on page migration, with an additional tab that shows pages that have translated content associated with them.
Looking at the issues we have completed this week, I am not seeing anything for content updates to pages that we have migrated over.
Yes, the Content Operations video was our recent overview of Workflows. This page and the additional resources that it links out to is also very helpful!
Spoke with our Contentful rep about how this scenario might look like:
A content author updates English content in a Contentful entry. This needs to be translated, so they start the 'Needs to be translated' workflow within Contentful. We have a webhook set to fire when this workflow starts. This webhook could contain the entire JSON payload of the entry and possibly the URL of the entry to be able to easily find it later.
Because an entry can have references to many other entries (ex: A 'page' entry has references to a 'hero', multiple 'card', 'headerAndText', and an 'asset'), these nested references will NOT be included in the initial payload that Contentful sends, nor would the URL be included.
Per Bilal:
...to get the nested entries ( or the parents ), another intermediary API is required. This custom API, when triggered via the webhook, will need to go back to Contentful and gather the entire JSON
Setting Up Your Webhook
Initialize a Webhook:
> Begin by creating a webhook for your application.
Configure Event Types:
Create Event: Triggered when a new entry starts in the workflow.
Save Event: Activates when an entry transitions within the workflow.
Webhook Payload Details:
> When events are triggered, the webhook payload will offer:
> - Workflow ID: Identifies the workflow (e.g., JD7PLxcOoeupDZ2zVnTCw).
> - Step ID: Indicates the specific workflow step.
Fetching Step Name via CMA API:
> Use the workflow ID to get the step name:
> https://{{cma_url}}/spaces/:space_id/environments/:environment_id/workflow_definitions/JD7PLxcOoeupDZ2zVnTCw
Execute Business Logic:
> With this info, run your business use case.
You will need both the 'Create' and 'Save' events for workflow:
A content author updates English content in a Contentful entry.
It would be great to see an example of this flow in real life, and understand what the content author knows about the content that's being created/updated. That's an important non-technical context. Knowing it, we (the Localization team) could derive what the translator (vendor) would see & what they need to know, and we (GitLab) would then help build the context-enhanced flow for the translator.
Because an entry can have references to many other entries (ex: A 'page' entry has references to a 'hero', multiple 'card', 'headerAndText', and an 'asset'), these nested references will NOT be included in the initial payload that Contentful sends, nor would the URL be included.
Would love to see that in action, too. Sounds like it may be the case of sending to translators only the translatable scope (the added/changed/diff), while missing some important related context (nested or parent references) of the entire page as it would look in a production website.
I am thinking, figuring the 2things above will help us (GitLab DEX team) understand how to move on with the technical part of what custom API calls may need to be triggered via what webhooks.