diff --git a/hasura.planx.uk/metadata/tables.yaml b/hasura.planx.uk/metadata/tables.yaml
index 34fcb58ac6..88b2926d03 100644
--- a/hasura.planx.uk/metadata/tables.yaml
+++ b/hasura.planx.uk/metadata/tables.yaml
@@ -1505,6 +1505,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
     - role: demoUser
@@ -1524,6 +1525,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
       comment: A demoUser can only insert a published flow for their own flows and for flows inside the Demo team [id = 32]
@@ -1536,6 +1538,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
     - role: teamEditor
@@ -1555,6 +1558,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
   select_permissions:
@@ -1566,6 +1570,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
         filter: {}
@@ -1578,6 +1583,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
         filter: {}
@@ -1590,6 +1596,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
         filter: {}
@@ -1602,6 +1609,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
         filter: {}
@@ -1614,6 +1622,7 @@
           - flow_id
           - has_send_component
           - id
+          - is_statutory_application_type
           - publisher_id
           - summary
         filter: {}
diff --git a/hasura.planx.uk/migrations/1737386213789_alter_table_public_published_flows_add_column_is_statutory_application_type/down.sql b/hasura.planx.uk/migrations/1737386213789_alter_table_public_published_flows_add_column_is_statutory_application_type/down.sql
new file mode 100644
index 0000000000..9391d06273
--- /dev/null
+++ b/hasura.planx.uk/migrations/1737386213789_alter_table_public_published_flows_add_column_is_statutory_application_type/down.sql
@@ -0,0 +1,61 @@
+
+alter table "public"."published_flows" drop column "is_statutory_application_type";
+
+CREATE OR REPLACE FUNCTION public.diff_latest_published_flow(source_flow_id uuid, since timestamp with time zone)
+ RETURNS published_flows
+ LANGUAGE sql
+ STABLE
+AS $function$
+WITH current_published_flow as (
+  SELECT
+    id, data, created_at, flow_id, publisher_id, summary, has_send_component
+  FROM
+    published_flows
+  WHERE
+    published_flows.flow_id = source_flow_id
+  ORDER BY
+    created_at desc
+  LIMIT
+    1
+),
+previous_published_flow as (
+  SELECT
+    flow_id, data
+  FROM
+    published_flows
+  WHERE
+    published_flows.flow_id = source_flow_id
+    AND
+    published_flows.created_at < since
+  ORDER BY
+    created_at desc -- the latest published version before "since"
+  LIMIT
+    1
+),
+data_diff as (
+  SELECT
+    flow_id,
+    ( SELECT
+        jsonb_object_agg(COALESCE(old.key, new.key), new.value)
+      FROM
+        jsonb_each(previous_published_flow.data) AS old
+      FULL OUTER JOIN 
+        jsonb_each(current_published_flow.data) AS new 
+      ON
+        new.key = old.key 
+      WHERE 
+        new.value IS DISTINCT FROM old.value
+    ) as data -- shallow diff where deleted keys have a 'null' value
+  FROM 
+    current_published_flow
+  JOIN
+    previous_published_flow USING (flow_id)
+)
+SELECT 
+    id, data_diff.data as data, created_at, flow_id, publisher_id, 'auto generated diff' as summary, has_send_component
+FROM 
+    current_published_flow
+FULL OUTER JOIN
+    data_diff USING (flow_id);
+$function$
+;
\ No newline at end of file
diff --git a/hasura.planx.uk/migrations/1737386213789_alter_table_public_published_flows_add_column_is_statutory_application_type/up.sql b/hasura.planx.uk/migrations/1737386213789_alter_table_public_published_flows_add_column_is_statutory_application_type/up.sql
new file mode 100644
index 0000000000..155b8bb5fb
--- /dev/null
+++ b/hasura.planx.uk/migrations/1737386213789_alter_table_public_published_flows_add_column_is_statutory_application_type/up.sql
@@ -0,0 +1,60 @@
+alter table "public"."published_flows" add column "is_statutory_application_type" boolean default 'false';
+ comment on column "public"."published_flows"."is_statutory_application_type" is E'This is updated on publish based on the flow graph containing application.type types that are in the ODP Schema';
+
+CREATE OR REPLACE FUNCTION public.diff_latest_published_flow(source_flow_id uuid, since timestamp with time zone)
+ RETURNS published_flows
+ LANGUAGE sql
+ STABLE
+AS $function$
+WITH current_published_flow as (
+  SELECT
+    id, data, created_at, flow_id, publisher_id, summary, has_send_component, is_statutory_application_type
+  FROM
+    published_flows
+  WHERE
+    published_flows.flow_id = source_flow_id
+  ORDER BY
+    created_at desc
+  LIMIT
+    1
+),
+previous_published_flow as (
+  SELECT
+    flow_id, data
+  FROM
+    published_flows
+  WHERE
+    published_flows.flow_id = source_flow_id
+    AND
+    published_flows.created_at < since
+  ORDER BY
+    created_at desc -- the latest published version before "since"
+  LIMIT
+    1
+),
+data_diff as (
+  SELECT
+    flow_id,
+    ( SELECT
+        jsonb_object_agg(COALESCE(old.key, new.key), new.value)
+      FROM
+        jsonb_each(previous_published_flow.data) AS old
+      FULL OUTER JOIN 
+        jsonb_each(current_published_flow.data) AS new 
+      ON
+        new.key = old.key 
+      WHERE 
+        new.value IS DISTINCT FROM old.value
+    ) as data -- shallow diff where deleted keys have a 'null' value
+  FROM 
+    current_published_flow
+  JOIN
+    previous_published_flow USING (flow_id)
+)
+SELECT 
+    id, data_diff.data as data, created_at, flow_id, publisher_id, 'auto generated diff' as summary, has_send_component, is_statutory_application_type
+FROM 
+    current_published_flow
+FULL OUTER JOIN
+    data_diff USING (flow_id);
+$function$;
diff --git a/scripts/seed-database/write/published_flows.sql b/scripts/seed-database/write/published_flows.sql
index c066a34736..4c818998f3 100644
--- a/scripts/seed-database/write/published_flows.sql
+++ b/scripts/seed-database/write/published_flows.sql
@@ -6,7 +6,7 @@ CREATE TEMPORARY TABLE sync_published_flows (
   summary text,
   publisher_id int,
   created_at timestamptz,
-  has_send_component boolean
+  has_send_component boolean  
   );
 
 /* Ensure columns here are kept in sync with container.sh */
@@ -19,7 +19,7 @@ INSERT INTO published_flows (
   summary,
   publisher_id,
   created_at,
-  has_send_component
+  has_send_component  
   )
 SELECT
   id,
@@ -29,7 +29,7 @@ SELECT
   publisher_id,
   created_at,
   has_send_component
-FROM sync_published_flows
+  FROM sync_published_flows
 ON CONFLICT (id) DO UPDATE
 SET
   data = EXCLUDED.data,